mysql查询以选择除
我有两个mysql表 第一个称为select,由id、user\u id和widget\u id字段组成 另一个称为widgets,它包括一些东西,包括widget\u id 我创建了一个过滤器,用户可以显示他/她选择的小部件,也可以显示他/她没有选择的小部件。对于他选择的那些,我使用以下方法:mysql查询以选择除,sql,mysql,Sql,Mysql,我有两个mysql表 第一个称为select,由id、user\u id和widget\u id字段组成 另一个称为widgets,它包括一些东西,包括widget\u id 我创建了一个过滤器,用户可以显示他/她选择的小部件,也可以显示他/她没有选择的小部件。对于他选择的那些,我使用以下方法: SELECT * FROM widgets, chosen WHERE chosen.user_id = $user_id AND chosen.widget_id = widgets
SELECT *
FROM widgets, chosen
WHERE chosen.user_id = $user_id
AND chosen.widget_id = widgets.widget_id
但是,我不知道如何显示他/她没有选择的内容。这不起作用,显示所有内容:
SELECT *
FROM widgets, chosen
WHERE !( chosen.user_id = $user_id
AND chosen.widget_id = widgets.widget_id)
我该怎么做?布尔逻辑:ab'与a'+b'相同
基本上,您希望从为给定$user\u id选择的窗口小部件中选择没有关联行的所有行。您可以通过左外部联接查找所选表中不匹配的行来完成此操作。大概是这样的:
SELECT w.* FROM widgets as w
LEFT OUTER JOIN chosen as c on c.widget_id=w.widget_id AND c.user_id=$user_id
WHERE c.id IS NULL;
顺便说一句:我建议使用较新的联接语法,而不是逗号分隔的表联接语法。它更容易阅读和理解,尤其是当涉及到外部联接时。使用NOT IN:
使用不存在:
左联接/左联接为空:
性能:
如果是的话。如果需要。谢谢!我最后使用了SELECT*from widgets w,其中w.widget\u id不在SELECT w.widget\u id from widgets w中,选择了c,其中c.widget\u id=w.widget\u id和c.user\u id=$user\u id
SELECT w.* FROM widgets as w
LEFT OUTER JOIN chosen as c on c.widget_id=w.widget_id AND c.user_id=$user_id
WHERE c.id IS NULL;
SELECT w.*
FROM WIDGET w
WHERE w.widget_id NOT IN (SELECT c.widget
FROM CHOSEN c
WHERE c.user_id = $user_id)
SELECT w.*
FROM WIDGET w
WHERE NOT EXISTS (SELECT NULL
FROM CHOSEN c
WHERE c.widget_id = w.widget_id
AND c.user_id = $user_id)
SELECT w.*
FROM WIDGET w
LEFT JOIN CHOSEN c ON c.widget_id = w.widget
AND c.user_id = $user_id
WHERE w.widget IS NULL