3

Web ページ用の単純なブログのようなニュース映画を作成しようとしています。そのために、3 つのテーブルがあります。1 つは投稿を含み、もう 1 つはカテゴリを含み、もう 1 つは投稿をカテゴリにリンクします (「関係」と呼ばれます)。

私はほとんどのクエリを管理することができましたが、まだ 1 つがわかりません: カテゴリのブログロールです。主な問題は、特定の各投稿からすべての関係を一覧表示したいということですが、特定の関係でフィルター処理しているため、もちろんこの 1 つしか表示されません。

例: テーブル 1 (投稿):

POST_ID POST_TITLE POST_CONTENT
1       TEST       TEST
2       TES2       TEST2

表 2 (カテゴリ):

CAT_ID CAT_NAME
1      NEWS
2      PRODUCTS

表 3 (関係):

REL_POST REL_CAT
1        1
1        2
2        2

したがって、投稿 1 は「ニュース」と「製品」の両方に属しており、「製品」カテゴリのブログロールを要求すると、次のように出力されます。

POST_ID POST_TITLE POST_CONTENT POST_CATEGORIES
1       TEST       TEST         1:NEWS,2:PRODUCTS
2       TES2       TEST2        2:PRODUCTS

その代わりに、POST_CATEGORIES には 2:PRODUCTS のみがリストされます。これは、REL_CAT でクエリをフィルター処理したためです。

これが私がなんとか作ったサンプルコードです:

SELECT `post_id`, `post_title`, `post_content`, GROUP_CONCAT(CONCAT(rel_cat,':', cat_name)) AS post_categories
FROM `posts`
LEFT JOIN `relations` ON (`rel_post` = `post_id`)
LEFT JOIN `categories` ON (`cat_id` = `rel_cat`)
WHERE rel_cat = 2

誰かが私が間違っていることを指摘できますか? 私はマニュアルを参照して Web を検索しようとしましたが、ほとんどの結果は逆の問題 (結合されたテーブルからの結果をフィルタリングしたい) を抱えている人々を指摘しています。読んだ。

前もって感謝します。

4

3 に答える 3

2

特定の を含むRELATIONを検索し、その のすべてのカテゴリを表示したいので、テーブルに追加の結合が必要です。postcategorypost

SELECT  a.post_id, 
        a.post_title, 
        a.post_content, 
        GROUP_CONCAT(CONCAT(b.rel_cat,':', c.cat_name)) AS post_categories
FROM    posts a
        INNER JOIN relations b
            ON b.rel_post = a.post_id
        INNER JOIN categories c
            ON c.cat_id = b.rel_cat
        INNER JOIN RELATIONS d  
            ON  a.POST_ID = d.REL_POST  AND 
                d.REL_CAT = 2               -- <<== SEARCH HERE
GROUP   BY a.post_id, a.post_title, a.post_content

出力

╔═════════╦════════════╦══════════════╦═══════════════════╗
║ POST_ID ║ POST_TITLE ║ POST_CONTENT ║  POST_CATEGORIES  ║
╠═════════╬════════════╬══════════════╬═══════════════════╣
║       1 ║ TEST       ║ TEST         ║ 1:NEWS,2:PRODUCTS ║
║       2 ║ TES2       ║ TEST2        ║ 2:PRODUCTS        ║
╚═════════╩════════════╩══════════════╩═══════════════════╝
于 2013-05-30T00:57:10.357 に答える
0

あなたが探しているのは次のようなものだと思います:

SELECT `post_id`, `post_title`, `post_content`, GROUP_CONCAT(CONCAT(rel_cat,':', cat_name)) AS post_categories
FROM `posts`
    LEFT JOIN `relations` ON (`rel_post` = `post_id`)
    LEFT JOIN `categories` ON (`cat_id` = `rel_cat`)
GROUP BY `post_id`

WHERE両方/すべてのカテゴリを取得して追加するには、条件を削除する必要がありますGROUP BY


特定の猫を含む投稿のみをフィルター処理して、その投稿のすべての猫を表示する場合は、テーブルに再度参加する必要があります。

SELECT post_id, post_title, post_content, GROUP_CONCAT(CONCAT(r.rel_cat,':', cat_name) ORDER BY r.rel_cat) AS post_categories
FROM posts
    LEFT JOIN relations r ON (r.rel_post = post_id)
    LEFT JOIN categories ON (cat_id = r.rel_cat)
    INNER JOIN relations r2 ON (r2.rel_post = post_id )
WHERE r2.rel_cat = 2
GROUP BY post_id
于 2013-05-30T00:42:53.627 に答える
0
SELECT `post_id`, `post_title`, `post_content`, GROUP_CONCAT(CONCAT(cat_id,':', cat_name)) AS post_categories
FROM `posts`
    JOIN `relations` r1 ON (r1.`rel_post` = `post_id`)
    JOIN `relations` r2 ON (r2.`rel_post` = `post_id`)
    JOIN `categories` ON (`cat_id` = r2.`rel_cat`)
WHERE r1.`rel_cat` = 2
GROUP BY `post_id`

SQLFIDDLE

于 2013-05-30T00:57:33.627 に答える