0

我的数据库中有 3 个表。

  • ab_contacts
    • ID
    • 地址簿_id
    • 等(更多,但这些是相关的)
  • ab_addressbooks
    • 姓名
    • ID
  • 共同评论
    • ID
    • 链接ID
    • 评论

我想创建一个查询,让我在给定的通讯录中选择与他们相关的所有联系人和评论。

要选择给定地址簿中的所有人,我可以使用:

select count(*) from ab_contacts where addressbook_id = '50';

这将返回 8152 人。

但是,当我运行查询时:

select
  ab_addressbooks.name,
  ab_contacts.first_name,
  ab_contacts.last_name,
  ab_contacts.email,
  ab_contacts.email2,
  ab_contacts.email3,
  ab_contacts.function,
  ab_contacts.address,
  ab_contacts.address_no,
  ab_contacts.city,
  ab_contacts.state,
  ab_contacts.zip,
  ab_contacts.home_phone,
  ab_contacts.work_phone,
  ab_contacts.cellular,
  REPLACE(REPLACE(REPLACE(ab_contacts.comment, '\r', ', '), '\n', ', '), '\\', '') AS comment,
  REPLACE(REPLACE(REPLACE(group_concat(co_comments.comments separator ', '), '\r', ', '), '\n', ', '), '\\', '') AS comment2
from ab_contacts
LEFT JOIN ab_addressbooks ON (ab_contacts.addressbook_id = ab_addressbooks.id)
LEFT JOIN co_comments ON (ab_contacts.id = co_comments.link_id)
WHERE ab_contacts.addressbook_id = '344';`

格式有效,但我只得到 1045 个结果。我确定我缺少一些东西,但我无法弄清楚。任何帮助将不胜感激。

4

2 回答 2

1

如果您将JOIN其他表添加到表地址簿中,MySQL 会将其解释为INNER JOIN. 这意味着只有在其他表中具有相应数据的行才会被返回,如果它们没有相应的数据,它们就不会出现在您的结果中。

如果这不是您想要的,您必须使用不同的JOIN类型(很可能是 a LEFT JOIN),请记住,您的结果将NULL在其他表中没有相关数据的字段中具有值。

于 2012-07-11T15:21:00.593 回答
1

尝试将你JOIN的替换为LEFT JOIN, 让人们没有评论,也许还添加一个GROUP BY ab_contacts.idif 会导致多行

于 2012-07-11T15:16:09.293 回答