0

私は 1 つの MySQL クエリに苦労していますが、それを理解することができます。URL アドレスに関する情報を含む 3 つのテーブルがあります。

1 つの「ドメイン」には一意のドメイン名が格納されます。これは、2 番目のテーブル「urls」の「親」テーブルであり、一意の URL 名といくつかの統計を格納します。各 URL レコードに複数のタグを追加できます。これらのタグは「tags」テーブルに保存されます。もちろん、「url_has_tag」と呼ばれる URL とタグの間に接続テーブルがあります。

すべての url レコードのドメイン名、url 統計、および連結されたタグを選択するクエリがあります。

SELECT u.url_id, u.url, d.domain, u.hits, u.version, GROUP_CONCAT( t.label) as tags
     FROM urls AS u
     INNER JOIN domains AS d 
        ON (u.parent_id = d.domain_id) 
    LEFT JOIN url_has_tag AS ut ON u.url_id = ut.url_id 
    LEFT JOIN tags as t ON ut.tag_id = t.tag_id
GROUP BY u.url_id
ORDER BY u.hits DESC

ここで、タグによるフィルタリング結果を追加する必要があります。つまり、同じ情報を選択しますが、タグでタグ付けされた URL のみを選択します。他のタグも付けられるので、結果に他のタグを含めたいと思います。

グループ化する前に WHERE 句を追加するとWHERE ut.tag_id = 7、正しい行が選択されますが、他のタグは含まれません (予想どおり)。

誰でもこれで私を助けることができますか?どうもありがとうございました。

4

2 に答える 2

0

左外部結合の右側のテーブルに where 句を追加すると、内部結合になります。したがって、以下のように join の ON 句に ut.tag_id = 7 を追加します。

SELECT u.url_id, u.url, d.domain, u.hits, u.version, GROUP_CONCAT( t.label) as tags
 FROM urls AS u
 INNER JOIN domains AS d 
    ON (u.parent_id = d.domain_id) 
LEFT JOIN url_has_tag AS ut ON u.url_id = ut.url_id and ut.tag_id = 7
LEFT JOIN tags as t ON ut.tag_id = t.tag_id
GROUP BY u.url_id
ORDER BY u.hits DESC
于 2013-09-10T06:00:19.247 に答える
0

友達のおかげで解決!

SELECT u.url_id, u.url, d.domain, u.hits, u.version, GROUP_CONCAT(DISTINCT(t2.label)) as tags
     FROM urls AS u
     INNER JOIN domains AS d
        ON (u.parent_id = d.domain_id)
     LEFT JOIN url_has_tag AS ut ON u.url_id = ut.url_id
     LEFT JOIN url_has_tag AS ut2 ON u.url_id = ut2.url_id
     LEFT JOIN tags as t ON ut.tag_id = t.tag_id
     LEFT JOIN tags as t2 ON ut2.tag_id = t2.tag_id
WHERE t.tag_id IN (7,8)
GROUP BY u.url_id
ORDER BY u.hits DESC

URL が WHERE .. IN 句の複数のタグに一致する場合、タグ名が複数回連結されるため、タグ名は DISTINCT である必要があります。

于 2013-09-10T15:25:07.083 に答える