1

3 つのテーブル (「ニュース」、「カテゴリ」、結合テーブル「メタ」) があります。category_idフィルターパラメーターとして提供されているものを含むニュースをフィルタリングしようとしています。以下の (および同様の) クエリを試しましたが、ニュース テーブルからすべてのニュースが返されます。

では、これらのニュースを次のようにフィルタリングする方法はmeta_id (category_id)?

どうもありがとう!

// カテゴリ テーブル
カテゴリ ID | 種別名
---------------------------
55 | スポーツ
56 | 政治

// メタテーブル
メタ ID | メタタイプ | rel_id | rel_type
------------------------------------------------------
55 | カテゴリ | 78345 | ニュース
56 | カテゴリ | 91278 | ニュース

ノート:
rel_id (メタ テーブル内) = id (ニュース テーブル内) // この場合は必要ありません
meta_id (メタ テーブル内) = category_id (カテゴリ テーブル内)

SQL:

SELECT n.*
FROM `news` n
LEFT JOIN `metas` m ON m.meta_type='category'
    WHERE m.meta_id=55 AND n.status=1
GROUP BY n.id
ORDER BY n.id DESC
LIMIT 0,10
4

3 に答える 3

1

最も重要なことは、にリンクmetasすることnewsです。あなたの質問を正しく読んだ場合、リンク フィールドはm.rel_id = n.idです。次のクエリ例では、カテゴリ 55 をフィルター処理する必要があります。

select  *
from    metas m
join    news n
on      m.rel_id = n.id
where   m.meta_type = 'category'
        and m.meta_id = 55
        and n.status = 1
order by
        n.id desc
limit   0, 10

group by注:クエリに a がある理由がわかりません。カテゴリでフィルタリングする必要はありません。

于 2012-09-15T11:56:49.167 に答える
0

ON句に条件を追加する必要があります。

SELECT n.*
FROM `ニュース` n
LEFT JOIN `metas` m ON m.meta_type='category' AND m.meta_id = n.category_id
    WHERE m.meta_id=55 AND n.status=1
GROUP BY n.id
ORDER BY n.id DESC
リミット 0,10
于 2012-09-15T11:12:42.950 に答える
0
SELECT n.*
FROM `news` n
LEFT outer JOIN `metas` m ON m.meta_id = n.category_id
    WHERE m.meta_id=55 AND n.status=1 and m.meta_type='category'
GROUP BY n.id
ORDER BY n.id DESC
LIMIT 0,10
于 2012-09-15T11:28:43.420 に答える