【问题标题】:List all products with no prices in MySQL在 MySQL 中列出所有没有价格的产品
【发布时间】:2013-08-08 21:33:24
【问题描述】:

这个查询是针对一个利基价格比较网站。

我有 2 个表格,第一个列出产品详细信息,第二个列出与该产品相关的所有价格。一种产品可以有一个或多个价格。

我希望列出所有没有有效价格的产品。

价格表中可能有一个 price = 0 的条目,在这种情况下 Prod_price_active 将设置为“0”。如果产品确实有价格,则 Prod_price_active 将设置为“1”

表 1

Prod_id
Prod_name
Prod_description

表 2

Price_id
Prod_id
Prod_price
Prod_price_active

【问题讨论】:

标签: mysql


【解决方案1】:

最简单的查询是:

select * from table1
where not exists (
    select * from table2
    where Prod_price_active = 1
    and Prod_id = table1.Prod_id)

这是语句“给我所有没有有效价格的产品”的 SQL 版本

【讨论】:

  • 为什么是嵌套查询?这可能是一种解决方案,但最好尽可能避免使用它们。
  • +1 。 . .因为是唯一正确的答案。用左外连接添加同样的东西是不值得的。
  • @ktm5124 查看编辑。初学者将能够更好地理解这一点。它会执行得很好:如果查询是针对具有数百万行的事务表,我不会推荐这种方法,但是可以有多少产品?
  • @Gordon,我认为左连接会表现得更好,就像我对stackoverflow.com/questions/18136113/…的回答一样
  • 产品总是少于 500 个,每个产品平均有 5 个价格。这个查询只会在做家务时运行。只是出于兴趣,执行此查询的更有效方法是什么?
【解决方案2】:

假设每个产品都在价格表中,您可以发送inner join

select a.Prod_id, a.Prod_name, a.Prod_description 
from PRODUCTS a inner join PRICES b 
on a.Prod_id = b.Prod_id 
where b.Prod_price_active=0

【讨论】:

    【解决方案3】:

    您正在寻找一种方法来执行anti-join

    SELECT table1.* FROM table1
                    LEFT JOIN table2 USING(prod_id) 
                    WHERE Prod_price IS NULL
                    OR Prod_price_active = 0
    

    这将只保留table1(“产品表”)中那些在table2(“价格表”)上没有对应条目的行那些有@ 987654325@设置为0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2012-08-16
      相关资源
      最近更新 更多