2

MySQL データベースにsuppliers, categories, subcats&の 4 つのテーブルがありますlistings

リストは、サプライヤー、カテゴリ、およびサブカテゴリ間の多対多の関係を可能にする結合テーブルです。それぞれの構造は次のとおりです。

サプライヤー

sp_id      sp_name       sp_email
1          Apple         info@apple.co
2          Samsung       info@samsung.co

カテゴリー

cat_id     cat_name
3          Electronics
4          Software

サブキャット

subcat_id  subcat_name   cat_id
5          Mobiles       3
6          Computers     3

リスト

list_id    sp_id         subcat_id
1          1             5
2          1             6

データを組み合わせて抽出しようとしているため、サプライヤーごとに 1 つのエントリしかなく、複数のサブカテゴリがリストされています。

結果

sp_id      sp_name       sp_email         cat_name / cats        subcat_name / subcats
1          Apple         info@apple.co    Electronics, Software  Mobiles, Computers
2          Samsung       info@samsung.co  Electronics            Mobiles

現在、次のクエリがあります

SELECT *
FROM suppliers as s
LEFT JOIN listings as l ON s.sp_id=l.sp_id
LEFT JOIN subcats as p ON p.subcat_id=l.subcat_id
LEFT JOIN categories as c ON c.cat_id=p.cat_id
ORDER BY s.sp_id

ただし、これはサプライヤごとに複数のエントリを出力し、関連するカテゴリまたはサブカテゴリごとに 1 つのエントリを出力します。SQL を介して、または PHP で複数のクエリを使用してそれを行う簡単な方法はありますか?

私の現在の mySQL に関する知識は限界に達しており、正しい方向への提案やアドバイスをいただければ幸いです。

4

3 に答える 3

1

使用するGROUP_CONCAT

SELECT  s.*, 
        GROUP_CONCAT(c.cat_name) catName,
        GROUP_CONCAT(p.subcat_name) subcatName
FROM    suppliers as s
        LEFT JOIN listings as l ON s.sp_id=l.sp_id
        LEFT JOIN subcats as p ON p.subcat_id=l.subcat_id
        LEFT JOIN categories as c ON c.cat_id=p.cat_id
GROUP   BY s.sp_id, s.sp_name, s.sp_email
ORDER   BY s.sp_id
于 2013-02-21T00:36:47.823 に答える
0

関数GROUP BYと一緒に式を使用したい。GROUP_CONCATこれにより、特定の値を共有する行をマージしながら、共有しない行を連結することができます。たとえば、あなたの場合、これは次のようになります。

SELECT s.sp_id, s.sp_name, group_concat(', ', c.cat_name) FROM suppliers as s LEFT JOIN listings as l ON s.sp_id=l.sp_id LEFT JOIN subcats as p ON p.subcat_id=l.subcat_id LEFT JOIN categories as c ON c.cat_id=p.cat_id ORDER BY s.sp_id GROUP BY s.sp_id, s.sp_name;

于 2013-02-21T00:42:02.150 に答える
0

GROUP BYと組み合わせて使用GROUP_CONCAT​​すると、値の 1 つとしてカンマ区切りのリストを使用して、特定の列の一意の値のみを表示できます。

于 2013-02-21T00:35:42.647 に答える