1

INSO で次のクエリのいくつかを検索しましたが、検索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

これを最適化するためのアイデアやアドバイスは非常に高く評価されます。

4

1 に答える 1

2

1. タグでアイテムを取得する

select  i.id
,       i.title
,       i.content
from    item i
join    item_tag it
on      i.id = it.id_item
join    tag t
on      t.id = it.id_tag
where   t.url in ('tag1', 'tag2')

2. 他のタグの関連タグを取得する

select  t2.url
,       count(it2.id_item)
from    tag t1 -- this tag
join    item_tag it1
on      t1.id = it.id_tag
join    item_tag it2 -- other tag for same item
on      it2.item_id = it1.item_id
join    tag t2
on      t2.id = it2.id_tag
where   t1.url in ('tag1', 'tag2')
        and t2.url not in ('tag1', 'tag2')
group by
        t2.url
于 2013-04-02T18:19:06.367 に答える