有没有更快更好的方法来执行此mysql查询?

时间:2018-11-03 15:09:03

标签: mysql

假设我有两个表。项目和存储。
它们之间通过项目ID相互关联。
我要列出的每个项目,在存储中都没有关系
我有一种直觉,我的陈述可能比这简单得多:

SELECT item.name,storage.stuff 
FROM item 
LEFT JOIN storage ON storage.item_id=item.id 
WHERE storage.stuff IS NULL 
GROUP BY item.id 

是否有一种方法可以将LEFT JOIN替换为另一个,所以我退回了没有任何内容的项目?
(我实际上想保留填充字段的返回值,即使它始终为NULL,因为我有一个查询函数通过多种方式列出项目,通过ajax为客户端提供服务,并且我不想在那里检查是否字段是否存在,提取部分均不存在

Table Item
id     name
1       a
2       b
3       c
4       d

Table Storage
item_id      stuff
1             this
1             that
2             this  

所需结果:

item_id     item_name     stuff
   3           c           NULL
   4           d           NULL

2 个答案:

答案 0 :(得分:2)

您无需在查询中使用Group By,因为您正在获取storage表中没有匹配项的情况。您的Group BY也不是有效的ANSI SQL,因为在Select子句中将提取未聚合的列/未按组的列。

SELECT item.id, item.name, storage.stuff 
FROM item 
LEFT JOIN storage ON storage.item_id=item.id 
WHERE storage.stuff IS NULL 

答案 1 :(得分:0)

对此有更多方法。

左联接方法

查询

SELECT
    Item.id
  , Item.name
  , Storage.stuff 
FROM
  Item 
LEFT JOIN
  Storage
ON
  Storage.item_id = Item.id 
WHERE
  Storage.stuff IS NULL

不存在方法

查询

SELECT
   Item.id
 , Item.name
 , NULL AS stuff
FROM 
 Item
WHERE
 NOT EXISTS (
  SELECT 
   1
  FROM 
   Storage
  WHERE 
   Storage.item_id = Item.id
)

NOT IN方法

查询

SELECT
   Item.id
 , Item.name
 , NULL AS stuff
FROM 
 Item
WHERE
 Item.id NOT IN (
    SELECT 
     Storage.item_id
    FROM 
     Storage
    WHERE 
      Storage.item_id = Item.id     
 )

参见演示https://www.db-fiddle.com/f/phKyPgvGJpZ5x1Lj6sisCd/0