我有两个mysql表。
第一个称为“选择”,由id,user_id和widget_id字段组成。
另一个称为“小部件”,包括widget_id等几项内容。
我创建了一个过滤器,以便用户可以显示他/她选择的小部件,也可以显示他/她没有选择的小部件。对于他选择的人,我使用以下方法:
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)
我该怎么做呢?
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
如果比较的列(任一表中的widget_id)不可为空,则LEFT JOIN / IS NULL在MySQL上表现最佳。如果列可为空(值可以为NULL),则NOT IN或NOT EXISTS的性能更好。