所以我网站的主页面显示了PMP的应用程序。用户可以使用“赞”,“不喜欢”或“中性/无”对这些应用进行评级(默认情况下,每个应用的评级均为中性/无。)
在主页面上,我想以最高的差异列出游戏(所以它需要总和Like和Dislike然后将它们加在一起。)我很难做出正确的SQL语句。
我的表结构是这样的:
appinfo: id; name; genre; ...
appinfo
基本上保存了应用的所有元数据。没什么关于评级。
接下来,我有apprating
表:
apprating: username; app_id; rating;
这是存储所有评级的地方。评级存储为-1(不喜欢),0(中性/无)和1(喜欢)。我希望这个结构可以更容易地设置整个语句。任何人都可以帮我写一篇文章吗?我最后写了一个没有正确排序或显示评级号的可笑的长篇。
SELECT appinfo.title, appinfo.description, appinfo.username, appinfo.genre
FROM appinfo
LEFT JOIN appratings ON appinfo.id=appratings.app_id
GROUP BY appinfo.id
ORDER BY SUM(appratings.rating) DESC
非常感谢您阅读此内容,只是一个SQL语句并纠正我的邪恶SQL方式会很好!
更新:
所以在有评级系统之前,我会有我的SELECT语句,然后在PHP中我mysql_fetch_array
,然后循环并回显他们的细节,有效地让我做以下事情:
...
<p class="description"><?php echo $gameinfo['description']; ?></p>
...
哪个会抓住它所在的游戏描述并回应它。现在,描述仍然有效,但由于我现在有一个奇怪的系统,涉及使用SUM和我的Like / Dislike和appinfo.id和apprating.app_id的JOIN语句,我现在遇到了问题
$gameinfo['id']
不回应任何内容。)更新2
SQL语句允许我编写echo $gameinfo['totalscore']
来获取Like / Dislike差异,我只需要将appinfo.id
添加到SELECT以便能够回显ID。
答案 0 :(得分:2)
您的GROUP BY子句需要包含SELECT列表中未以某种方式聚合的所有列。您可能碰巧知道特定应用程序的描述,标题和其他详细信息不会更改,但数据库引擎不会更改,因此需要 了解每个选定的列是固定的(作为GROUP BY的一部分)还是聚合的(SUM,COUNT,MIN,MAX等)
SELECT appinfo.title, appinfo.description, appinfo.username, appinfo.genre,
SUM(appratings.rating) AS totalscore
FROM appinfo LEFT JOIN appratings
ON appinfo.id=appratings.app_id
GROUP BY appinfo.title, appinfo.description, appinfo.username, appinfo.genre
ORDER BY totalscore DESC
;
答案 1 :(得分:1)
通过更改GROUP BY子句中的列来查看是否获得了正确的结果。
SELECT appinfo.title, appinfo.description, appinfo.username, appinfo.genre
FROM appinfo
LEFT JOIN appratings ON appinfo.id=appratings.app_id
GROUP BY appinfo.title, appinfo.description, appinfo.username, appinfo.genre
ORDER BY SUM(appratings.rating) DESC