IN
SO で次のクエリのいくつかを検索しましたが、検索INNER JOIN
に一致するものが見つかりませんLEFT JOIN
。
現在のデータベース関係
1. タグでアイテムを取得する
TAG.url
から取得した文字列$_GET
であるため、INT ID ではありません。
たとえば、 url のmydomain/items/tag1+tag2/
場合、次のリクエストがあります。
1 つのタグは簡単でしたが、2 つ以上のタグの場合、次は mySQL で機能しないようです:
SELECT
ITEM.id AS 'item_id',
ITEM.title AS 'item_title',
ITEM.content AS 'item_content'
FROM ITEM, ITEM_TAG, TAG
WHERE
(ITEM.id=ITEM_TAG.id_item AND TAG.id=ITEM_TAG.id_dtag AND TAG.url='tag1')
AND
(ITEM.id=ITEM_TAG.id_item AND TAG.id=ITEM_TAG.id_dtag AND TAG.url='tag2')
...
AND
(ITEM.id=ITEM_TAG.id_item AND TAG.id=ITEM_TAG.id_dtag AND TAG.url='tagn')
これは機能します:
SELECT
ITEM.id AS 'item_id',
ITEM.title AS 'item_title',
ITEM.content AS 'item_content'
FROM ITEM
INNER JOIN TAG TAG1
ON TAG1.url='tag1'
INNER JOIN ITEM_TAG ITEM_TAG1
ON ITEM_TAG1.id_item=ITEM.id AND ITEM_TAG1.id_tag=TAG1.id
INNER JOIN TAG TAG2
ON TAG2.url='tag2'
INNER JOIN ITEM_TAG ITEM_TAG2
ON ITEM_TAG2.id_item=ITEM.id AND ITEM_TAG2.id_tag=TAG2.id
...
INNER JOIN TAG TAGn
ON TAG2.url='tagn'
INNER JOIN ITEM_TAG ITEM_TAGn
ON ITEM_TAGn.id_item=ITEM.id AND ITEM_TAGn.id_tag=TAGn.id
この時点で、それを行うより良い方法はありINNER JOIN
ますON
か?
2. 他のタグの関連タグを取得する
ここでは、タグのリストと、他のタグに一致するアイテムの数を取得したいと思います。
たとえば、次のフィクスチャを想像してみましょう:
ITEM_TAG TAG
id_item | id_tag id | url
1 | 1 1 | tag1
1 | 2 2 | tag2
1 | 3 3 | tag3
1 | 4 4 | tag4
2 | 1
2 | 2
2 | 3
3 | 1
3 | 2
常に次の検索でmydomain/items/tag1+tag2/
。
いくつかのアイテムと関係のある他のタグを表示したい(それらの関係が存在する場合)。
申し訳ありませんが、次を出力するリクエストの作成方法がわかりません。
TAG
url count(id_item)
tag3 | 2
tag4 | 1
この結果を得るには?
編集
私はうまくいくように思われる次のことを試しました:
SELECT
COUNT(id_item) AS 'nb_item',
TAG.url AS 'tag_url'
FROM ITEM_TAG, TAG
WHERE
url NOT IN ('tag1','tag2')
AND id_item IN
(
SELECT id_item FROM ITEM_TAG, TAG
WHERE url IN ('tag1','tag2') AND id_tag=id
)
AND id_tag=id
GROUP BY TAG.id ORDER BY nb_item DESC
これを最適化するためのアイデアやアドバイスは非常に高く評価されます。