0 レビュー
4 回答
各カテゴリから最後の3つのニュースを選択します-2つのテーブル-(MySQL-PHP)
2つのテーブルから、各カテゴリの最新の3つのニュースを選択したい
first table ' Categories ' & ' news '
カテゴリテーブル
ID_CAT | NAME | PRIORITE
ニューステーブル
ID | ID_CAT | TITLE | THE_NEWS
このSQLコードで制限を加えようとしていますが、すべてのカテゴリの最後の3つのニュースしか得られません
SELECT C.PRIORITE, N.*
FROM categories C, news N
WHERE N.ID_CAT=C.ID_CAT
AND C.PRIORITE >1
ORDER BY N.ID DESC
LIMIT 3
PRIORITE > 1
のニュースをすべて取得しようとしています(優先度はカテゴリの順序です)。したがって、各優先度から最後の3つのニュースを取得します。
例:
Priorite 2 = get last 3 news
Priorite 3 = get last 3 news
...など
インターネットで検索しましたが、何もうまくいきませんでした。解決策はありますか?または、IDがパラメータを送信して各カテゴリからニュースを取得するために、別の関数を作成する必要がありますか?
わからない
0
レビュー
答え :
解決策:
nnoを取得できます。相関サブクエリを使用した各カテゴリのニュースの一覧
SELECT *
FROM news n
JOIN categories c ON c.id = n.category_id
WHERE c.priority > 1
AND (
SELECT COUNT(*)
FROM news
WHERE n.category_id = category_id
AND n.id <= id
) <= 3;
または、Mysql 8を使用している場合は、ウィンドウ関数を一般的なテーブル式で使用できます
WITH cte AS(
SELECT *,
RANK() OVER (PARTITION BY category_id ORDER BY id DESC ) rnk
FROM news
ORDER BY id
)
SELECT *
FROM cte n
JOIN categories c ON c.id = n.category_id
WHERE c.priority > 1
AND rnk <= 3;
わからない
0
レビュー
答え :
解決策:
複雑なクエリではなく、2つの部分に分割することをお勧めします
前半でカテゴリを取得できます
select * from Categories
次に、カテゴリをループし、ループ内で3つのニュースを取得します。
select * from news where cat_id = '' order by desc id limit 3
両方を試して実行時間を確認すると、ループにかかる時間が短くなります。ニュースが急速に成長しているからです。なぜ私が何度もクエリを呼び出すのかと思うのは知っていますが、私の先生は複雑なクエリではなく複数のクエリを好むと言いました
わからない
0
レビュー
答え :
解決策:
このクエリを試してください。機能するはずです:
SELECT
C.PRIORITE, N.*
FROM
categories C
JOIN news N ON N.ID_CAT=C.ID_CAT
AND C.PRIORITE >1
GROUP BY
C.ID_CAT
HAVING
COUNT(*) <= 3
ORDER BY N.ID DESC
Lemmeはそれに問題があるかどうかを知っています。
わからない
0
レビュー
答え :
解決策:
このクエリを試してください。このクエリは、PRIORITEに基づいて各レコードの行番号を生成します。次に、3以下の行番号を返します。
SELECT ID, PRIORITE, THE_NEWS
FROM
(
SELECT ID, PRIORITE, THE_NEWS ,
@rn := IF(@prior = PRIORITE, @rn + 1, 1) AS rn,
@prior := PRIORITE
FROM(
SELECT t.*,c.PRIORITE FROM news t
LEFT JOIN categories c ON t.ID_CAT=c.ID_CAT ) e
CROSS JOIN (select @rn:=0, @prior:=null) c
ORDER BY PRIORITE,ID desc
) as x
WHERE x.rn <= 3 ;
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。