【问题标题】:One query join with multiple rows from one table一个查询与一张表中的多行连接
【发布时间】:2010-12-01 23:30:50
【问题描述】:

好的,所以我在 MySQL 中有两个表。一张表保存客户信息,另一张表保存电话号码。我需要在一个查询中加入这些表,以从电话表中选择最多两个电话号码以及客户信息。现在我的查询是:

SELECT customers.name, phones.phone, phones2.phone 
FROM customers 
LEFT JOIN phones ON phones.customerid=customers.id 
LEFT JOIN phones AS phones2 ON phones2.customerid=customers.id 
GROUP BY customers.id;

但是,这会为电话 1 和电话 2 返回相同的电话号码。基本上我需要做的就是将电话 2 偏移 1,但我不知道如何在语法上做到这一点。

电话位于单独的表中,因为它是一对多的关系。

我需要将其放在一个查询中,因为我将其直接导出到 csv。

非常感谢您的帮助。提前致谢。

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:

    那么您只想为每位客户提供任意 0、1 或 2 个电话号码?如果是这样MaxMin 好吗?这将为您节省加入。

    SELECT customers.name, 
           MAX(phones.phone) AS phone, 
           CASE WHEN MAX(phones.phone) = MIN(phones.phone) THEN NULL ELSE MIN(phones.phone) END AS phone2
    FROM customers 
    LEFT JOIN phones ON phones.customerid=customers.id 
    GROUP BY customers.id;
    

    【讨论】:

    • 我明白了。这也可以正常工作。问题是我让我的问题比我最初的问题更简单。我实际上为每个客户提取了三个电子邮件和三个电话号码。我可以想出一些可以使用它的解决方案,但我认为它很快就会变得非常混乱。但是,这肯定只适用于两个人。
    • @thejew - 那么您的实际查询将加入phones 3 次?我想你可以结合这两种方法,这样你就可以从第二个 JOIN 中获得 MaxMin(即来自 phones2)如果我有更多时间,我会尝试敲出一个 row_number 类型的解决方案 @987654321 @
    【解决方案2】:

    为避免两次获得相同的电话号码,您可以更改此设置:

    LEFT JOIN phones AS phones2 ON phones2.customerid=customers.id 
    

    到这里:

    LEFT JOIN phones AS phones2 ON phones2.customerid=customers.id
    AND phones2.phone <> phones.phone
    

    【讨论】:

    • 这是完美的。我投票给你,然后试图接受答案,但它说我必须等待 9 分钟。我会尽快做的。谢谢,马克。
    • @thejew - 您不需要为此两次加入电话表。
    • 不加入两次怎么办?
    • @thejew:查看他发布的答案。
    • @thejew - 这取决于选择要带回的 2 个电话号码的标准。如果您只想要任何 2 个数字,则可以使用 MaxMin。如果有更多涉及的标准,那么通过模拟row_number 可能是可能的。据我了解您当前的查询对于您将获得的 2 是不确定的。
    【解决方案3】:

    您要做的是删除数字相同的情况。

    SELECT customers.name, phones.phone, phones2.phone 
    FROM customers 
    LEFT JOIN phones ON phones.customerid=customers.id 
    LEFT JOIN phones AS phones2 ON phones2.customerid=customers.id 
    WHERE phones2.phone != phones.phone
    GROUP BY customers.id
    

    【讨论】: