SQL - 根据查询中的结果添加标志 - 最佳做法?

时间:2015-06-08 22:57:47

标签: php mysql sql database

我在mySQL DB中有三个表:

tbl_usertbl_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 -| 是一个布尔值,表示此项isOwneditemID中列在与传递的tbljn_userItem相同的记录中。

我意识到我可以在源代码中轻松完成此操作,而不是SQL。但是,我想以“正确的方式”做到这一点,并对其进行优化。我错误地认为,如果我在SQL端执行此操作,它会更有效吗?我在运行时正在做多个用户,我觉得每次进行一次数据库调用会更有效率。

感谢所有帮助!

1 个答案:

答案 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