【问题标题】:Get list of data from a Table based on data in a related table without duplicate根据相关表中的数据从表中获取数据列表,不重复
【发布时间】:2020-12-04 03:54:06
【问题描述】:

数据库中的表:

  1. 我在 MySQL STORESNEW_ARRIVALS 中有两个表。
  2. 一个有所有商店的详细信息,另一个表存储新到货的详细信息(如果有)。
  3. 两者都通过store_id 列链接。

我想做的事:

  1. 列出所有有到达条目的商店,而不显示重复的商店。

我尝试了两个 SQL 查询:

SELECT 
        stores.id,
        stores.name 
        new_arrivals.id,
        new_arrivals.title,
        new_arrivals.store_id
FROM 
        stores, 
        new_arrivals

上述 SQL 有效,但列出了多个商店。对于商店中的每个新到货,都有一排。每个商店我只想要一个条目。

所以我尝试了以下 SQL 查询:

SELECT         
       na.id,
       na.is_active,
       na.store_id      
FROM 
       new_arrivals  as na    
group by na.store_id

上述查询给出了唯一的store_ids,但我可以从stores 表中获取信息。

我进一步尝试了以下没有结果:

SELECT         
       na.id,
       na.is_active,
       na.store_id      
FROM 
       new_arrivals  as 

INNER JOIN (
    SELECT name 
    FROM stores as sl
) As locations

group by na.store_id 

实现这一目标的最佳方法是什么?

【问题讨论】:

标签: mysql join duplicates foreign-keys relationship


【解决方案1】:

您的查询的问题是您缺少表之间的连接条件。没有它,您实际上是在生成表的笛卡尔积。

这个:

FROM 
    stores, 
    new_arrivals

应该写成:

FROM stores
INNER JOIN new_arrivals
    ON new_arrivals.store_id = stores.store_id

但即使这样,每次到达您仍会得到一排,这似乎不是您想要的。我想你想要exists

select s.*
from store s
where exists (
    select 1
    from new_arrivals na 
    where na.store_id = s.store_id
)

【讨论】:

  • 感谢您的解释。它有助于更​​好地了解正在发生的事情。
【解决方案2】:

这仅给出那些在新到货中有条目的商店。

SELECT 
        distinct s.id, s.name 
FROM stores s 
INNER JOIN new_arrivals na on na.store_id = s.store_id;

希望这是你想要的。

【讨论】:

  • 谢谢。这是一个巧妙的解决方案。
猜你喜欢
  • 2021-08-14
  • 1970-01-01
  • 2012-07-03
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2018-05-18
  • 2020-12-05
相关资源
最近更新 更多