在做臨時變量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 ;
我想添加的圖片由於某種原因未添加。請嘗試執行代碼部分中發佈的查詢。 – Vivek
可以添加圖像。爲清晰起見,請參閱圖像。 – Vivek
您的代碼似乎在SQL小提琴中工作:http://www.sqlfiddle.com/#!9/0ddee8/1。 –