0

次の2つのテーブルがあります

table_article :

id  subject     tags
---------------------
1   subject-1   2,4,5
2   subject-2   3,5
3   subject-3   1,2
4   subject-4   2,3,4
5   subject-5   3

テーブルタグ:

id  tag_name
---------------------
1   php
2   jQuery
3   css
4   mysql
5   java

そして、私は次のような結果を得ようとしています

id => 1, subject => subject-1, tag_names => jQuery,mysql,java
id => 2, subject => subject-2, tag_names => css,java
id => 3, subject => subject-3, tag_names => php,jQuery

これが私の現在の試みです。これは最初のタグのみを返します(たとえば、行1の2,4,5ではなく2)

 1    SELECT
 2        table_article.id,
 3        table_article.subject,
 4        GROUP_CONCAT(table_tags.tag_name) AS tag_names
 5    FROM
 6        table_article
 7    LEFT JOIN
 8        table_tags
 9    ON
10        (table_tags.tag_id IN (table_article.tags))
11    GROUP BY
12        table_article.id
13    LIMIT
14        3

結果は

id => 1, subject => subject-1, tag_names => jquery
id => 2, subject => subject-2, tag_names => css
id => 3, subject => subject-3, tag_names => php

問題は10 行目で発生します-> IN (table_article.tags)

どうすればこの問題を解決できるのかわかりません。誰か助けてもらえますか?

4

4 に答える 4

3

たまたまコンマを含む文字列を離散値のリストとして使用することはできません。

言い換えれば、これは:

ON table_tags.tag_id IN (2,4,5)

これと同じではありません:

ON table_tags.tag_id IN ('2,4,5')

'2,4,5' のような文字列の数値は最初の数値部分であり、最初の非数値文字の後の残りは無視されます。したがって、文字列 '2,4,5' の数値は 2 です。エラーにはなりませんが、意図したとおりにはなりません。これは、カンマ区切りの値のいずれかと一致します。リスト。

MySQL には、FIND_IN_SET()カンマ区切りの値を含む文字列を理解する組み込み関数があります。この関数は、一致する値の位置を返します。一致が見つからなかった場合は 0 を返します。

ON FIND_IN_SET(table_tags.tag_id, '2,4,5') > 0

ただし、これはインデックスを使用できず、パフォーマンスを低下させるテーブルスキャンを強制的に実行する必要があります。明確にするために、この関数を結合条件で使用することはお勧めしません。

答えは:タグをコンマ区切りのリストに格納しないでください。データベース列にコンマ区切りのリストを保存するのは本当に悪いですか? の 私の回答を参照してください。

@Martin Lyneが提案するように、行ごとに1つのタグを別のテーブルに保存します。そうすれば、適切なタグを探すことが=でき、さらにパフォーマンスを向上させるために列にインデックスを付けることができます。

于 2012-11-02T20:38:01.893 に答える
1

ON で IN を見たことがありません (有効でないとは言っていません) が、私はそうするでしょう。ON table_tags.tag_id = table_article.tags)

したがって、複数の行になります

subject-1, query
subject-1, css
subject 2, query

次に、GROUP BYはテーブルを圧縮しGROUP_CONCAT、不足しているすべてのタグを取得します。

于 2012-11-02T20:32:13.123 に答える
0

他の人が言ったように、これは良いデザインではありません。

代わりに、次の方法でテーブルのデザインを変更できます。

table_article
   id
   subject

article_tag
   article_id
   tag_id

table_tags
   id
   tag_name

人生はこの方法ではるかに簡単になります:-)

于 2012-11-02T20:46:46.977 に答える
0

まあ、私はINこの状況で使用しFIND_IN_SET(table_tags.tag_id, table_article.tags) > 0ますが、うまくいきません。あなたは本当にこれを正規化する必要がありますが。

于 2012-11-02T20:35:27.280 に答える