Py学习  »  DATABASE

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

Ninet9 • 6 年前 • 1567 次点击  

假设我有两张桌子。项目和存储。
它们之间按项目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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40710
文章 [ 2 ]  |  最新文章 6 年前
Raymond Nijland
Reply   •   1 楼
Raymond Nijland    6 年前

有更多的方法…

左连接方法

查询

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

Madhur Bhaiya
Reply   •   2 楼
Madhur Bhaiya    6 年前

你不需要使用 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