我有一个问题,我正在寻找合适的方式说出来......我目前有一个公式:
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有它们???
答案 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条目。