我在mySQL DB中有三个表:
tbl_user
和tbl_item
以及tbljn_userItem
(包含前两个主键的表,多对多关系。)
我想创建一个SQL语句,它将返回tbl_item
中所有项目的列表,其中包含一个标志值,用于标识分配给特定 userID 的项目({{ 1}}主键)。
基本上是:
的组合/衍生物tbl_user
和
SELECT tbl_item.*
FROM tbl_item, tbljn_userItem
WHERE tbljn_useritem.userID=tbl_user.userID
SQL不是我的第一语言,所以如果这是一个明显的问题,我很抱歉。
SELECT * FROM tbl_item
tbl_user
|- userID -|- firstName -|- lastName -|- streetAddress -|- city -|
tbl_item
|- itemID -|- name -|- description -|- category -|- cost -|
tbljn_userItem
所以,我给SQL语句 userID ,它有望返回(例子):
|- userID -|- itemID -|
其中|- itemID -|- name -|- description -|- category -|- cost -|- isOwned -|
|- itemID -|- name -|- description -|- category -|- cost -|- isOwned -|
|- itemID -|- name -|- description -|- category -|- cost -|- isOwned -|
|- itemID -|- name -|- description -|- category -|- cost -|- isOwned -|
是一个布尔值,表示此项isOwned
在itemID
中列在与传递的tbljn_userItem
相同的记录中。
我意识到我可以在源代码中轻松完成此操作,而不是SQL。但是,我想以“正确的方式”做到这一点,并对其进行优化。我错误地认为,如果我在SQL端执行此操作,它会更有效吗?我在运行时正在做多个用户,我觉得每次进行一次数据库调用会更有效率。
感谢所有帮助!
答案 0 :(得分:0)
CREATE TABLE tbl_user
(
userId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
lastName VARCHAR(100) NOT NULL
);
-- drop table tbl_item;
CREATE TABLE tbl_item
(
itemId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
theName VARCHAR(100) NOT NULL,
description VARCHAR(255) NOT NULL,
category VARCHAR(20) NOT NULL, -- normalize this?
cost DECIMAL(10,2) NOT NULL
);
-- drop table tbljn_userItem;
CREATE TABLE tbljn_userItem
(
userId INT NOT NULL,
itemId INT NOT NULL,
PRIMARY KEY (userId,itemId) -- in addition maybe a 2nd index going the other way, another covered index
-- will leave FK RI to you
);
INSERT tbl_user(lastName) VALUES ('smith'),('collins'),('jacobs');
INSERT tbl_item (theName,description,category,cost) VALUES ('flashlight','a working flashlight','camping',14.95);
INSERT tbl_item (theName,description,category,cost) VALUES ('mittens','mittens','winter wear',8.95);
INSERT tbl_item (theName,description,category,cost) VALUES ('scarf','red scarf, fuzzy','winter wear',8.95);
INSERT tbl_item (theName,description,category,cost) VALUES ('kite','yellow kite','kids',8.95);
INSERT tbljn_userItem (userId,itemId) VALUES (3,2),(2,2),(1,2);
-- select * from tbl_user;
-- select * from tbl_item;
-- select * from tbljn_userItem;
SELECT i.itemId,
i.theName,
i.description,
i.category,
i.cost,
( CASE
WHEN j.itemId IS NULL THEN 'no' ELSE 'yes' END
) AS isOwned
FROM tbl_item i
LEFT JOIN tbljn_userItem j ON j.itemId=i.itemId AND j.userId=1
LEFT JOIN tbl_user u
ON u.userId=j.userId AND u.userId=1
ORDER BY i.itemId
itemId theName description category cost isOwned
1 flashlight a working flashlight camping 14.95 no
2 mittens mittens winter wear 8.95 yes
3 scarf red scarf, fuzzy winter wear 8.95 no
4 kite yellow kite kids 8.95 no