SQL - 需要弄清楚如何显示单个用户没有的所有内容

时间:2015-09-11 22:34:43

标签: php mysql mysqli mysql-workbench

我有一个问题,我正在寻找合适的方式说出来......我目前有一个公式:

 SELECT * 
     FROM useritems JOIN (iteminfo) 
         ON (iteminfo.id=useritems.itemid) 
     WHERE active='Y' AND userid!='$userid' 
     ORDER BY itemid DESC LIMIT 40";

旨在显示USER(A)没有的所有项目。

假设USER A有项目: A,B,C,D,E,F,

理论上,该公式仅显示G-Z ......

我的问题是,如果用户B有项目A,B,C,那么这些项目会显示在此列表中,因为并非用户A拥有它们......用户B拥有它们(因此它不是用户A)。如何防止这些项目出现在USER A的FEED中,因为用户B有它们???

3 个答案:

答案 0 :(得分:0)

您需要做的是获取items表格中存在的所有可能itemInfo,然后使用A找到LEFT JOIN所不具备的所有NULL并选择以SELECT * FROM useritems AS 'u' LEFT JOIN (SELECT * FROM itemInfo GROUP BY item) AS 'i' ON u.id=i.itemid WHERE active='Y' AND userid='$userid' AND i.item IS NULL ORDER BY itemid DESC LIMIT 40;

出现的那些
lib

答案 1 :(得分:0)

您的查询显示除A以外的用户持有的所有项目。您可以使用子查询返回用户持有的所有项目,然后使用NOT IN将其排除。

SELECT *
FROM iteminfo
WHERE id NOT IN (
    SELECT itemid
    FROM useritems
    WHERE active = 'Y' AND userid = '$userid'
)
ORDER BY id DESC LIMIT 40

或等效的LEFT JOIN

SELECT i.*
FROM iteminfo AS i
LEFT JOIN useritems AS u ON i.id = u.itemid AND u.active = 'Y' AND u.userid = '$userid'
WHERE u.itemid IS NULL
ORDER BY i.id DESC LIMIT 40

答案 2 :(得分:0)

这看起来像左连接的好例子。我做了类似的事情:

SELECT iteminfo.itemid
FROM iteminfo
LEFT JOIN useritems ON (iteminfo.id=useritems.itemid) AND (useritems.userid = '$userid')
WHERE active='Y' AND userid IS NULL
ORDER BY itemid DESC LIMIT 40";

这假设userid在useritems表中。在userid上的左连接将为每个iteminfo条目抓取一行,并检查它们是否在WHERE中为空将为您提供所有在用户标识不匹配的iteminfo条目。