7

重複の可能性:
mysqlは複数の列の配列です

私は2つのテーブルを持っています:

投稿テーブル

PostID | Gallery
  1    | 4,7,8,12,13
  2    | 1,2,3,4
  3    | 5,8,9
  4    | 3,6,11,14

Galleryの値は、Imagesテーブルの主キーです。

画像表

ImageID | FileName
   1    | something.jpg
   2    | lorem.jpg
   3    | ipsum.jpg
   4    | what.jpg
   5    | why.jpg

PostIDキーをImagesテーブルに追加する代わりにこれを行う理由は、これらの画像を多くの異なる投稿に関連付けることができるためです。リレーションシップ用に別のテーブルを追加できると思いますが、コンマ区切りの値は、追加に使用しているjQueryスクリプトに関しては操作が簡単です。

PostID 3に関連付けられた画像を必要とするページを表示している場合、そのページのすべてのファイル名を出力するためにどのような種類のクエリを実行できますか?

4

3 に答える 3

26

このソリューションを使用できます。

SELECT b.filename
FROM posts a
INNER JOIN images b ON FIND_IN_SET(b.imageid, a.gallery) > 0
WHERE a.postid = 3

SQLFiddle

ただし、実際にはデザインを正規化し、投稿と画像の間で相互参照テーブルを使用する必要があります。これは、N:M(多対多)関係を表すための最良かつ最も効率的な方法です。検索がはるかに効率的であるだけでなく、画像の関連付けの更新削除が大幅に簡素化されます。


...ただし、コンマ区切りの値は、追加に使用しているjQueryスクリプトに関する限り、操作が簡単です。

相互参照テーブルを使用してN:M関係を適切に表現した場合でもimageid、CSV形式で'を取得できます。

posts_has_images主キーフィールド(postidimageid)を持つテーブルがあるとします。

それぞれの'のGROUP_CONCAT()CSVを取得するために使用できます:imageidpostid

SELECT postid, GROUP_CONCAT(imageid) AS gallery
FROM posts_has_images
GROUP BY postid
于 2012-07-13T01:57:14.027 に答える
1

適切なSQLに関しては、区切られた列ではなく、2つを関連付けるための別のテーブルが必要です。

そうは言っても、これがあなたがそれを行うことができる方法です:

SELECT * FROM Images i WHERE EXISTS (SELECT 1 FROM Posts p WHERE p.PostID = 3 AND i.ImageID IN (p.Gallery))
于 2012-07-13T02:03:27.220 に答える
1

これがあなたの問題です。Galleryフィールドの特定の値を検索する必要があるため、これは不適切な設計です。を使用できますFIND_IN_SETが、クエリは遅くなります。Galleryのアトミック値に目を向けます-正規化します。

于 2012-07-13T02:04:08.357 に答える