0

データベースに3つのテーブルがあります。

  • ab_contacts
    • id
    • ファーストネーム
    • 苗字
    • addressbook_id
    • など(もっと、しかしこれらは関連するものです)
  • ab_addressbooks
    • 名前
    • id
  • co_comments
    • id
    • link_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タイプ (ほとんどの場合 ) を使用する必要があります。結果には、他のテーブルに関連するデータがないフィールドに値が含まLEFT JOINれることに注意してください。NULL

于 2012-07-11T15:21:00.593 に答える
1

JOINあなたをに置き換えてLEFT JOIN、コメントなしで人々を取得してみてください。また、GROUP BY ab_contacts.id場合によっては、結果が多くの行になる場合も追加してください

于 2012-07-11T15:16:09.293 に答える