2017-11-08 19 views
1

タグで記事を表示しようとしています。以下のクエリは完璧に動作します。PHPタグシステムのためのMysqlクエリ

これが私のクエリです:

SELECT 
    item.item_id, 
    item.item_title, 
    item.item_createdate, 
    GROUP_CONCAT(tag.tag_name) AS TagName 
FROM 
    item 
LEFT JOIN `item-tag` ON `item-tag`.item_id = item.item_id 
LEFT JOIN tag ON tag.tag_id = `item-tag`.tag_id 
    /*WHERE item.item_type = 1*/ 
GROUP BY 
    item.item_id 
ORDER BY 
    item_createdate 
DESC 

enter image description here enter image description here

私は結果をフィルタするとき、私は開始を持っています問題。

WHERE tag.tag_name = 'Tag 1' 

これはGROUP_CONCAT から他のタグを削除し、私はこの結果を得る:

enter image description here

を私は「タグ1」の結果を見たい場合は、私は、where句を追加しますタグ付き記事を取得するにはどうしたらいいですか?

+0

...個人的にはあなたがそれらの厄介なバックスラッシュを使用する必要がないように、私はテーブルitem_tagに名前を付けるだろうpreference-- ?

の代わりに値を入れて、あなたは試してみました'WHERE tag.tag_name LIKE '%Tag 1%''を使用していますか?そうすれば、複数のタグ名が存在する限り、それは重要ではありません。 – Zeke

+0

@Zeke私はすでにそれを試みました。それはうまくいきませんでした。 – emre

+0

「LIKE」もうまく動作するにはしばらく時間がかかります。準備された文を使用していますか? – Zeke

答えて

1

てみてください:GROUP_CONCATとGROUP BYは、論理的に、大きなテーブルを生成し、この結果を連結しているため、動作しないタグ名でフィルタする

WHERE EXISTS 
    (SELECT tag_id FROM tag 
    JOIN `item-tag` tmp ON tag.tag_id = tmp.tag_id 
    WHERE tmp.item_id = item.item_id AND tag.tag_name = 'Tag 1') 

注意。フィルタリングが早すぎると、この大きなテーブルからエントリが削除されるため、タグは連結内に表示されません。

別のアプローチは、サブクエリとして、既存のクエリを使用し、私は準備されたステートメントで使用されるプレースホルダを使用

SELECT * FROM (...existing query...) as foo 
WHERE TagName LIKE '%Tag 1%' 
+0

これは 'Tag 1'タグ付き記事を表示しています。 – emre

+1

これは機能しました。 'WHERE tag.tag_id IN(SELECT tag_id FROM tag where tag.tag_id = item-tag.tag_id)' – emre

+1

@emreこれは 'タグ1'とは関係ありません。私は結合を追加する答えを編集しました –

1
SELECT 
    item.item_id, 
    item.item_title, 
    item.item_createdate, 
GROUP_CONCAT(tag.tag_name) AS TagName 
FROM 
    item 
LEFT JOIN `item-tag` ON `item-tag`.item_id = item.item_id 
LEFT JOIN tag ON tag.tag_id = `item-tag`.tag_id 

--limit your existing query by only including item_ids with 'Tag 1' 
WHERE item.item_id IN(
    SELECT `item-tag`.item_id 
    FROM tag INNER JOIN `item-tag` ON tag.tag_id=`item-tag`.tag_id 
    WHERE tag.tag_name=? 
    ) 

GROUP BY 
    item.item_id 
ORDER BY 
    item_createdate 
DESC 

注意とそれを囲むようにあります。 PHPMyAdminのために、当然のことながら、ちょうど

+0

さんに感謝します。私はIN句を使いたいと思っていましたが、動作させることができませんでした。あなたのソリューションは完璧に機能します。 – emre