10

たぶん私の質問はそれほど明確ではありません、私に説明させてください:私が必要とするのは、対応するクライアント番号/卸売業者の組み合わせとともにすべてのユーザーのリストを取得することです、すべてのクライアントは1から4つの異なるクライアント番号/卸売業者の組み合わせを持っています

私のデータベースには2つのテーブルがあります

USERS
id | name
---------
1  | a
2  | b

CLIENT_NUMBERS
id | user_id | number | wholesaler
----------------------------------
1  | 1       | ac1    | aw1
2  | 1       | ac2    | aw2
3  | 2       | bc1    | bw1

単純なINNERJOINを使用して、対応するクライアント番号/卸売業者ごとに1つずつ、クライアント行を複製しました。

このクエリでGROUP_CONCATを使用して結果を修正することができました。

SELECT a.id AS user_id, a.name AS Name 
GROUP_CONCAT(b.client_no, ', ', b.wholesaler SEPARATOR '; ') AS client_no_wholesaler 
FROM users AS a 
INNER JOIN client_numbers AS b ON a.id = b.user_id 
GROUP BY ID

user_id | name | client_no_wholesaler
--------------------------------------------
1       | a    |  ac1, aw1; ac2, aw2 
2       | b    |  bc1, bw1

これまでのところ良好ですが、クライアント番号と卸売業者の組み合わせを別の列に「分解」して、結果が次のようになるようにする必要があります。

user_id | name | client_no_wholesaler1 | client_no_wholesaler2 | ...up to 4
----------------------------------------------------------------------------
1       | a    |  ac1, aw1             | ac2, aw2              |
2       | b    |  bc1, bw1             |                       |

クラスを使用してXLSファイルを生成し、クエリ結果の列に基づいているため、単純なPHP explodeでクエリ結果を取得した後にこれを行うことはできませんが、アイデアをいただければ幸いです。

4

1 に答える 1

5

あなたが望むものは一般的に「ピボット」と呼ばれます。

追加の列ごとに追加の結合を使用してSQLでコーディングする方法は次のとおりです。

SELECT
    a.id AS user_id,
    a.name AS Name,
    CONCAT(b1.client_no, ', ', b1.wholesaler) AS client_no_wholesaler1,
    CONCAT(b2.client_no, ', ', b2.wholesaler) AS client_no_wholesaler2,
    CONCAT(b3.client_no, ', ', b3.wholesaler) AS client_no_wholesaler3,
    CONCAT(b4.client_no, ', ', b4.wholesaler) AS client_no_wholesaler4
FROM users AS a
JOIN client_numbers AS b1 ON b1.user_id = a.id
LEFT JOIN client_numbers AS b2 ON b2.user_id = a.id and b2.id > b1.id
LEFT JOIN client_numbers AS b3 ON b3.user_id = a.id and b3.id > b2.id
LEFT JOIN client_numbers AS b4 ON b4.user_id = a.id and b4.id > b3.id
GROUP BY 1, 2

ON追加の結合は、追加の結合の句に増え続けるid条件を追加することにより、重複する結合を回避することに注意してください。idが適切な順序列でない場合は、結合を区切るために別のものを選択してください。

于 2012-10-05T01:39:04.780 に答える