【问题标题】:MySql - how to combine where clauses for both tables for one to many join?MySql - 如何组合两个表的 where 子句以进行一对多连接?
【发布时间】:2018-10-29 17:37:43
【问题描述】:

我有两张桌子:

sellers
id|name

locations
id|seller_id|name

现在我想在 where 子句中获取卖家并加入位置并结合两个表中的属性。

初始查询是:

SELECT 
    sellers.id
FROM sellers
JOIN locations.seller_id = sellers.id

我必须再添加一个部分,因为我不想要重复的数据:

SELECT 
    sellers.id
FROM sellers
JOIN locations on locations.seller_id = sellers.id
WHERE (
    SELECT id from locations
    WHERE locations.seller_id = sellers.id
    LIMIT 1
)

现在我可以做以下事情了

SELECT 
    sellers.id
FROM sellers
JOIN locations on locations.seller_id = sellers.id
WHERE (
    SELECT id from locations
    WHERE locations.seller_id = sellers.id
    LIMIT 1
)
AND (
    sellers.name = 'test'
    OR
    locations.name = 'test'
)
  • 这里的问题是 MySql 将加入第一个位置,如果该位置的名称不是“test”,并且该卖家的名称为“test”的位置,它将不会出现在结果中。

有什么想法吗?

更新:

数据示例:

sellers
id|name
1|test
2|test2


locations
id|seller_id|name
1|1|test3
2|2|test4
3|2|test
4|2|test


result should be 
[1, 2] but with my query it is [1] 

【问题讨论】:

  • JOIN locations.seller_id = locations.id 在这里没有任何意义。你可能需要JOIN locations.seller_id = sellers.id
  • 您的查询充满了语法错误;你到底想达到什么目标?
  • sry 我更新了查询
  • 请提供相关且最少的样本数据,展示您的要求和预期输出。请参阅此链接以了解如何构建一个好的 SQL 问题:Why should I provide an MCVE for what seems to me to be a very simple SQL query?

标签: mysql sql


【解决方案1】:

如果你让你的 SQL 更简单,答案就会变得更简单。

SELECT DISTINCT
    sellers.*
FROM sellers
    INNER JOIN locations on locations.seller_id = sellers.id
WHERE
    sellers.name = 'test'
    OR
    locations.name = 'test'

【讨论】:

  • 您的查询结果与我在 UPDATED 部分中的示例是 [1, 2, 2] 但它应该是 [1, 2],我可以添加 group by 但随后出现 only_full_group_by 错误,我知道很热抑制该错误,但我更喜欢没有分组的解决方案...
  • @fico7489 要么您输入错误我的查询,要么您未提供的其他信息正在改变结果。
  • 与您的查询第二个卖家将在结果中重复
  • 我忘记了我没有在我的示例查询中输入 ORDER BY,但是是的,如果没有 ORDER BY 位置,您的查询也可以工作。有些东西,太棒了...
【解决方案2】:

您可以将Group ByHaving 一起使用:

SELECT sellers.id, 
       sellers.name, 
       SUM(locations.name = 'test') AS has_test_location 
FROM sellers
    INNER JOIN locations on locations.seller_id = sellers.id
GROUP BY sellers.id, sellers.name 
HAVING sellers.name = 'test' OR 
       has_test_location 

【讨论】:

  • 嗯,很好,我认为上面的查询会起作用,虽然我更喜欢更简单的东西,但我认为没有什么更简单的了:(
  • @fico7489 没有子查询,这是我认为可以实现的最简单的。
  • @Strawberry 只是一个变量名,以便 OP 了解它的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多