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

lkaoscv7  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(369)

假设我有两张table。物品,和储存。
它们之间存在项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

有没有办法将左连接替换为另一个连接,以便返回没有连接的项目?
(实际上,我想保持stuff字段的返回,即使它总是空的,因为我有一个查询函数,它通过ajax为clientside提供很多方法来列出项目,我不想在那里检查该字段是否存在,也不想在获取部分检查)

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
mwg9r5ms

mwg9r5ms1#

有更多的方法。。
左连接方法
查询

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
)

不在方法中
查询

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

kmb7vmvb

kmb7vmvb2#

你不需要使用 Group By 在查询中,当您获取 storage table。你的 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

相关问题