0

私の現在のコードでは、

$sql = "SELECT *, SUM(news_points.points) as `total`
CASE `total` WHEN 0 THEN ORDER BY `news_id` ASC
CASE `total` WHEN NOT 0 THEN ORDER BY `total` DESC
FROM `news`,`news_points`";

私は2つのテーブルを持っていnewsますnews_points. 私がしたいのは、という名前の列newsに基づいて選択することです。aにポイントがない場合、またはマイナスの場合は、「良い」ニュースの下に置きます。これは、プラスのポイントがあるか、少なくともマイナスではないニュースです。news_pointspointsnews

役立つかもしれないいくつかのスキーマ。

news table

news_id -- news_title
  1 -- New publication available.
  2 -- Check out this new car!
  3 -- Something else.

news_points table

point_id -- news_id -- point
  1 -- 1 -- 2
  2 -- 1 -- 5
  3 -- 1 -- -4
  4 -- 2 -- 5
  5 -- 3 -- -2

上記の例に基づいています。のニュースにnews_id=1は 3 ポイントnews_id=2があり、5 ポイントnews_id=3があり、-2 ポイントがあるため、news_id 2 のニュースが最初になり、news_id 1 のニュースが 2 番目になり、news_id が返される行の最後になります。しかし、それらのいずれにも評価がないか、一部しか評価されていない場合、残りは news_id の降順で表示されます。

結果を正しく取得するには、この SQL をどのように記述すればよいでしょうか?

4

2 に答える 2

3

クエリは次のようになります。

$sql = "SELECT news.*, SUM(news_points.points) as total
          FROM news left join news_points 
            ON news.news_id = news_points.news_id
          GROUP BY news.news_id
          ORDER BY total DESC, news.news_id ASC";

また、この短いデモを参照してください。

于 2013-06-16T06:06:03.913 に答える
1

あなたの質問は理解するのが少し難しいです。結果を見るために最善のチェ​​ックを試みました

 select news.news_id, sum(point) as sum, news.*  from 
news left join news_points on news.news_id= news_points.news_id
group by news.news_id order by sum desc

あなたの答えにSQLフィドルも参照してください

例を参照してください

于 2013-06-16T06:24:58.577 に答える