php - 左连接重复项

标签 php mysql query-optimization left-join

我有几个表需要查询以获取特定用户的所有行。 表格基本上是这样的

contact
=======
id_contact PK
firstName
lastName
...

contact_phone
===============
id_contact_phone, PK
id_contact, FK
id_phone_type, FK
phone
...

phone_type
============
id_phone_type PK
phone_type
....

除了用于emailphone 等的表格外,还有很多类似的表格。我需要显示给定联系人的所有信息,我是使用多个 LEFT JOIN 但我不确定如何输出信息。

这是我的查询

SELECT contact.id_contact, contact.lastName, contact.firstName, contact_email.email, email_type.email_type, contact_phone.phone, phone_type.phone_type, contact_company.contact_title, company.company_name
FROM contact 
    LEFT JOIN contact_email
        ON contact.id_contact = contact_email.id_contact
    LEFT JOIN email_type 
        ON contact_email.id_email_type = email_type.id_email_type
    LEFT JOIN contact_phone
        ON contact.id_contact = contact_phone.id_contact
    LEFT JOIN phone_type
        ON contact_phone.id_phone_type = phone_type.id_phone_type
    LEFT JOIN contact_company
        ON contact.id_contact = contact_company.id_contact
    LEFT JOIN company
        ON contact_company.id_company = company.id_company
WHERE contact.id_contact = $cid

我的问题是,如果某个联系人有多个电话号码、电子邮件等。查询显然会返回多于 1 行,所以我不确定如何显示信息,因为大多数列都是每个列的重复项其他的。这是该查询可能返回的示例

+===========================================================================================+  
| id_contact | lastName | firstName | email            | email_type |  phone   | phone_type |
+===========================================================================================+
| 1          | Doe      | John      | john.doe@123.com | Work       | 555-1234 | Work       |
+------------+----------+-----------+------------------+------------+----------+------------+  
| 1          | Doe      | John      | john.doe@123.com | Work       | 555-2222 | Mobile     | 
+-------------------------------------------------------------------+----------+------------+
| 1          | Doe      | John      | jdoe@email.com   | Personal   | 555-1234 | Work       | 
+------------+----------+-----------+------------------+------------+----------+------------+  
| 1          | Doe      | John      | jdoe@email.com   | Personal   | 555-2222 | Mobile     |
+-------------------------------------------------------------------+----------+------------+

如何在没有冗余数据的情况下在 php 中显示信息,我的查询是否可以优化?

最佳答案

mysql 有一个很棒的group_concat 函数。结合 GROUP BYid_contact`,这将做你想做的。对于您的示例:

SELECT contact.id_contact, contact.lastName, contact.firstName,
    GROUP_CONCAT(CONCAT(contact_email.email, ' : ', email_type.email_type) SEPARATOR ', ') AS email,
    GROUP_CONCAT(CONCAT(contact_phone.phone, ' : ', phone_type.phone_type) SEPARATOR ', ') AS phone,
    contact_company.contact_title, company.company_name
FROM contact 
    LEFT JOIN contact_email
        ON contact.id_contact = contact_email.id_contact
    LEFT JOIN email_type 
        ON contact_email.id_email_type = email_type.id_email_type
    LEFT JOIN contact_phone
        ON contact.id_contact = contact_phone.id_contact
    LEFT JOIN phone_type
        ON contact_phone.id_phone_type = phone_type.id_phone_type
    LEFT JOIN contact_company
        ON contact.id_contact = contact_company.id_contact
    LEFT JOIN company
        ON contact_company.id_company = company.id_company
WHERE contact.id_contact = $cid

请注意,我从未在普通 CONCAT 周围使用过 GROUP_CONCAT,但我看不出它为什么不起作用。

关于php - 左连接重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3129763/

相关文章:

php - undefined index :Magento 2.2.6中带有NewRelic模块的Magento\Framework\App\State

php - 使用 PHP 从数据库中读取

mysql - AWS Glue 未将 id(int) 列复制到 Redshift - 它是空白的

sql - 如何优化包含多个 OR、AND、IN 语句的查询?

postgresql - 大表查询的第一次调用出奇慢

mysql - MYSQL中针对子查询的查询优化?

php - 最佳实践 : Import mySQL file in PHP; split queries

php - 对php数组中的唯一值进行排序

php - Laravel 中缓慢的 MySQL 查询在其他地方却很快

mysql - 如何在整个数据库中查找外键违规? (我目前正在使用 MySQL)