2017-08-13 19 views
1

在做臨時變量R & D時,我遇到了數據庫的異常行爲。 爲了充分解釋我的問題,我共享表格模式及其數據。MySQL @local_variable不能連續工作

這些都是我的表:

CREATE TABLE category (
    categoryId INT PRIMARY KEY AUTO_INCREMENT, 
    categoryName VARCHAR(100) NOT NULL UNIQUE, 
    categoryFlag TINYINT NOT NULL DEFAULT 0 
); 

CREATE TABLE object (
    objectId INT PRIMARY KEY AUTO_INCREMENT, 
    objectName VARCHAR(100) NOT NULL UNIQUE, 
    objectFlag TINYINT NOT NULL DEFAULT 0 
); 

CREATE TABLE mapping(
    mapId INT PRIMARY KEY AUTO_INCREMENT, 
    catId INT NOT NULL, 
    objId INT NOT NULL, 
    mapFlag TINYINT NOT NULL DEFAULT 0, 
    CONSTRAINT UC_mapping_cat_obj UNIQUE (catId,objId) 
); 

這些都是我插入到表中的記錄:

INSERT INTO category(categoryName) VALUES ('Beverage'); 
INSERT INTO category(categoryName) VALUES ('Dairy Product'); 
INSERT INTO category(categoryName) VALUES ('Desert'); 
INSERT INTO category(categoryName) VALUES ('Digestive Food'); 
INSERT INTO category(categoryName) VALUES ('Fruit'); 
INSERT INTO category(categoryName) VALUES ('Herb'); 
INSERT INTO category(categoryName) VALUES ('Preservative'); 
INSERT INTO category(categoryName) VALUES ('Spice'); 
INSERT INTO category(categoryName) VALUES ('Vegetable'); 

INSERT INTO object(objectName) VALUES ('Apple'); 
INSERT INTO object(objectName) VALUES ('Butter'); 
INSERT INTO object(objectName) VALUES ('Cabbage'); 
INSERT INTO object(objectName) VALUES ('Cake'); 
INSERT INTO object(objectName) VALUES ('Chili'); 
INSERT INTO object(objectName) VALUES ('Clove'); 
INSERT INTO object(objectName) VALUES ('Cinnamon'); 
INSERT INTO object(objectName) VALUES ('Coffee'); 
INSERT INTO object(objectName) VALUES ('Coriander'); 
INSERT INTO object(objectName) VALUES ('Curd'); 
INSERT INTO object(objectName) VALUES ('Curry Leaves'); 
INSERT INTO object(objectName) VALUES ('Green Tea'); 
INSERT INTO object(objectName) VALUES ('Holy Basil'); 
INSERT INTO object(objectName) VALUES ('Ice Cream'); 
INSERT INTO object(objectName) VALUES ('Indian Gooseberry'); 
INSERT INTO object(objectName) VALUES ('Lemon'); 
INSERT INTO object(objectName) VALUES ('Milk'); 
INSERT INTO object(objectName) VALUES ('Spinach'); 
INSERT INTO object(objectName) VALUES ('Turmeric'); 
INSERT INTO object(objectName) VALUES ('Tea'); 

INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Beverage' AND objectName = 'Coffee'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Beverage' AND objectName = 'Green Tea'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Beverage' AND objectName = 'Tea'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Dairy Product' AND objectName = 'Butter'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Dairy Product' AND objectName = 'Curd'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Dairy Product' AND objectName = 'Ice Cream'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Dairy Product' AND objectName = 'Milk'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Desert' AND objectName = 'Ice Cream'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Desert' AND objectName = 'Cake'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Digestive Food' AND objectName = 'Curd'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Digestive Food' AND objectName = 'Indian Gooseberry'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Digestive Food' AND objectName = 'Lemon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Fruit' AND objectName = 'Apple'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Fruit' AND objectName = 'Indian Gooseberry'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Fruit' AND objectName = 'Lemon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Clove'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Cinnamon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Coriander'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Holy Basil'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Turmeric'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Preservative' AND objectName = 'Clove'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Preservative' AND objectName = 'Cinnamon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Preservative' AND objectName = 'Lemon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Chili'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Cinnamon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Curry Leaves'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Holy Basil'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Turmeric'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Vegetable' AND objectName = 'Cabbage'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Vegetable' AND objectName = 'Coriander'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Vegetable' AND objectName = 'Spinach'; 

是連接映射表類和對象表的查詢:

SET @catName=''; 
SELECT 
    CASE WHEN @catName=categoryName THEN '' ELSE @catName:=categoryName END AS catName, 
    objectName 
FROM mapping 
INNER JOIN category ON catId = categoryId 
INNER JOIN object ON objId = objectId 
ORDER BY categoryName, objectName ; 

Screenshot highlighting the problem

正如你在圖中看到的,我突出顯示了應該顯示'Preservative'值的行,但是顯示'Spice',而下面的行必須顯示'Spice'值,但是顯示'Preservative'。

我無法弄清楚這種不尋常行爲的原因。我試圖改變內部連接表的順序,但它不起作用。加入「類別」表或「對象」表似乎也不起作用。

我能夠想出可以重現此問題的序列。

-- Insert in -> category 
INSERT INTO category(categoryName) VALUES ('Digestive Food'); 
INSERT INTO category(categoryName) VALUES ('Beverage'); 
INSERT INTO category(categoryName) VALUES ('Fruit'); 
INSERT INTO category(categoryName) VALUES ('Desert'); 
INSERT INTO category(categoryName) VALUES ('Vegetable'); 
INSERT INTO category(categoryName) VALUES ('Preservative'); 
INSERT INTO category(categoryName) VALUES ('Dairy Product'); 
INSERT INTO category(categoryName) VALUES ('Spice'); 
INSERT INTO category(categoryName) VALUES ('Herb'); 



-- Insert in -> object 
INSERT INTO object(objectName) VALUES ('Cake'); 
INSERT INTO object(objectName) VALUES ('Turmeric'); 
INSERT INTO object(objectName) VALUES ('Chili'); 
INSERT INTO object(objectName) VALUES ('Tea'); 
INSERT INTO object(objectName) VALUES ('Coriander'); 
INSERT INTO object(objectName) VALUES ('Apple'); 
INSERT INTO object(objectName) VALUES ('Butter'); 
INSERT INTO object(objectName) VALUES ('Cabbage'); 
INSERT INTO object(objectName) VALUES ('Spinach'); 
INSERT INTO object(objectName) VALUES ('Ice Cream'); 
INSERT INTO object(objectName) VALUES ('Clove'); 
INSERT INTO object(objectName) VALUES ('Milk'); 
INSERT INTO object(objectName) VALUES ('Coffee'); 
INSERT INTO object(objectName) VALUES ('Green Tea'); 
INSERT INTO object(objectName) VALUES ('Holy Basil'); 
INSERT INTO object(objectName) VALUES ('Cinnamon'); 
INSERT INTO object(objectName) VALUES ('Curry Leaves'); 
INSERT INTO object(objectName) VALUES ('Lemon'); 
INSERT INTO object(objectName) VALUES ('Curd'); 
INSERT INTO object(objectName) VALUES ('Indian Gooseberry'); 



-- Insert in -> mapping 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Dairy Product' AND objectName = 'Butter'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Holy Basil'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Cinnamon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Coriander'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Dairy Product' AND objectName = 'Ice Cream'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Desert' AND objectName = 'Cake'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Desert' AND objectName = 'Ice Cream'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Fruit' AND objectName = 'Lemon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Cinnamon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Digestive Food' AND objectName = 'Curd'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Dairy Product' AND objectName = 'Curd'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Vegetable' AND objectName = 'Spinach'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Holy Basil'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Curry Leaves'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Digestive Food' AND objectName = 'Indian Gooseberry'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Digestive Food' AND objectName = 'Lemon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Fruit' AND objectName = 'Apple'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Fruit' AND objectName = 'Indian Gooseberry'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Preservative' AND objectName = 'Lemon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Vegetable' AND objectName = 'Cabbage'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Clove'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Beverage' AND objectName = 'Tea'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Herb' AND objectName = 'Turmeric'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Vegetable' AND objectName = 'Coriander'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Preservative' AND objectName = 'Clove'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Dairy Product' AND objectName = 'Milk'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Beverage' AND objectName = 'Green Tea'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Chili'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Preservative' AND objectName = 'Cinnamon'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Spice' AND objectName = 'Turmeric'; 
INSERT INTO mapping (catId,objId) SELECT categoryId, objectId FROM category JOIN object WHERE categoryName = 'Beverage' AND objectName = 'Coffee'; 



-- Select Query 
SET @catName=''; 
SELECT 
    categoryName, 
    CASE WHEN @catName=categoryName THEN '' ELSE @catName:=categoryName END AS catName, 
    objectName 
FROM mapping 
INNER JOIN category ON catId = categoryId 
INNER JOIN object ON objId = objectId 
ORDER BY categoryName, objectName ; 
+0

我想添加的圖片由於某種原因未添加。請嘗試執行代碼部分中發佈的查詢。 – Vivek

+0

可以添加圖像。爲清晰起見,請參閱圖像。 – Vivek

+0

您的代碼似乎在SQL小提琴中工作:http://www.sqlfiddle.com/#!9/0ddee8/1。 –

回答

0

MySQL可以用變量挑剔。說實話,我已經看到這個問題GROUP BY,但不是ORDER BY。您可以使用子查詢解決它:

SELECT categoryname, 
     CASE WHEN @catName=categoryName THEN '' ELSE @catName:=categoryName END AS catName, 
     objectName 
FROM (SELECT categoryname, objectname 
     FROM mapping INNER JOIN 
      category 
      ON catId = categoryId INNER JOIN 
      object 
      ON objId = objectId 
     ORDER BY categoryName, objectName 
    ) co CROSS JOIN 
    (SELECT @catName = '') params; 

Here是SQL小提琴。

+0

它正在工作。 我也爲這個查詢做了解釋,甚至顯示了體面的統計數據。 謝謝。 – Vivek

+0

@Vivek。 。 。我無法弄清楚會導致你觀察到的行爲的合理情況。我確實認爲這很奇怪。 –

+0

同樣在這裏。也許我們可以對此進行研究。請告訴我你是否知道原因。 – Vivek