0

データベースに mainTable と classificationTable の 2 つのテーブルがあります。

メインテーブル:

id  |   classification_id   |   name
---------------------------------------
1   |           1           |   Name1
2   |           2,3,4       |   Name2
3   |           1,4         |   Name3
4   |           4           |   Name4

分類表:

classification_id   |   class_name
---------------------------------------
        1           |   Class Name1
        2           |   Class Name2
        3           |   Class Name3
        4           |   Class Name4

たとえば、次のように mainTable から ID 3 の行を選択したい:

id          =   3
class_name  =   Class Name1, Class Name4
Name        =   Name3

私はこの選択を試みますが、これは配列から最初の要素のみを返します(ID 3の行の例、これはクラス名1のみを返します)

SELECT i.*, 
(SELECT GROUP_CONCAT(cl.class_name) FROM classificationTable as cl WHERE cl.classification_id IN(i.classification_id)) as class_name 
FROM mainTable as i;

PLZを助けてください。

4

2 に答える 2

1

はい、データベースの設計が不十分です。しかし、やりたいことはできます。

これには 2 つの手順が必要です。1 つ目は、mainTable のリストで各 classification_id を検索して、mainTable を classificationTable に結合することです。like演算子を使用してこれを行うことができます。

2 番目のステップは、すべてのクラス名を 1 つの列に戻すことです。これは を使用して処理されgroup_concatます。

次のクエリはこれを実現します (ただし、テストされていないため、タイプミスがある可能性があります)。

select mt.id, mt.name, group_concat(ct.class_name separator ', ')
from mainTable mt join
     classificationTable ct
     on concat(',', classification_id, ',') like concat('%,', ct.classification_id, ',%')
group by mt.id, mt.name
于 2012-12-03T19:16:03.247 に答える
1

問題あなたmainTableの.

列は値のclassification_id連結であってはなりませんが、classification_id ごとに個別の行があり、id によって mainTable に関連付けられる新しいテーブルが必要です。

例えば

id  |   classification_id   
---------------------------------------
1   |           1           
2   |           2           
2   |           3         
2   |           4           
3   |           1       
3   |           4     
4   |           4    

これが完了すると、クエリがはるかに簡単になります。

于 2012-12-03T18:53:46.523 に答える