0

こんにちは、次のように 2 つの mysql テーブルがあります。

アイテム

id item_name user_id
1    test1     1    
2    test2     1
3    test3     1
4    test4     1  

事業

id user_id items
1    1       1,3
2    1       2,4

プロジェクト内の各アイテムを返すことができる結合クエリを作成するにはどうすればよいですか?

project1 =>
    item1=>
      [id1] =>
      [name1] =>
    item3=>
      [id3] =>
      [name3] =>

ありがとう。

UPDATE アイテム表 ここに画像の説明を入力

プロジェクト表 ここに画像の説明を入力

4

2 に答える 2

3

まず、区切られた値の文字列をデータベースに保存しないでください。通常、データを維持およびクエリする手段で自分自身を制限しています。データを正規化します (この場合は、project_itemsテーブルproject_iditem_id列を導入します)。長期的には大きな利益をもたらします。

FIND_IN_SET()それまでの間、テーブルに参加するために使用できます

SELECT p.id project_id, p.user_id, i.id item_id, i.item_name 
   FROM project p LEFT JOIN items i
     ON FIND_IN_SET(i.id, p.items) > 0
    AND p.user_id = i.user_id
 ORDER BY p.id, i.id

出力:

| | PROJECT_ID | ユーザー ID | ITEM_ID | ITEM_NAME |
----------------------------------------------
| | 1 | 1 | 1 | テスト1 |
| | 1 | 1 | 3 | テスト3 |
| | 2 | 1 | 2 | テスト2 |
| | 2 | 1 | 4 | テスト4 |

これがSQLFiddleのデモです

更新:の値にitemsスペースを含めないでください。それらを削除するか、REPLACE()このように使用してください

    ON FIND_IN_SET(i.id, REPLACE(p.items, ' ', '')) > 0

これがSQLFiddleのデモです

于 2013-08-06T06:52:46.693 に答える
0

あなたのアプローチは良くありません。アイテムとプロジェクトの間にリレーショナル テーブルを作成する必要があります。コンマが後に続く値のリストをレコードに含めることはお勧めできません。

project_items という追加のテーブル リレーショナルを作成する必要があります。

次の文を使用して、プロジェクトからアイテムを取得できます

select project_items.id_project, items.item_name, items.user_id 
from project_items 
left join items on project_items.id_item = items.id

それはより良いアプローチです

于 2013-08-06T06:54:40.610 に答える