我想知道你是否可以帮我一个SQL查询。 我有两张桌子:设计和投票。 设计有来自用户的投票,因此投票表的结构如下所示:
我需要的是在网页上显示所有少于50张选票的设计,但我正在努力解决这个问题...你能帮我一个忙吗?
我正在尝试这样的事情,它确实以低于50票的价格返回设计,但它不包括没有投票的设计。
SELECT * FROM `votes` as Vote, `designs` as Design, `users` as User
WHERE `Design`.`id` = `Vote`.`design_id`
GROUP BY `Vote`.`design_id`
HAVING COUNT(*) > 50;
毋庸置疑,我在SQL中是一个完全的业余爱好者。 任何帮助将不胜感激。
谢谢你们!
答案 0 :(得分:2)
SELECT designs.*, photo.* /* You only need designs */
FROM designs /* You are looking for designs, so start there */
JOIN photos ON designs.id = photos.design_id /* append the matching photo */
LEFT JOIN votes ON designs.id = votes.design_id /* append all votes */
GROUP BY designs.id /* group all rows by design */
HAVING COUNT(*) > 50;
我在这里做的是:我选择所有设计并附加匹配的照片(JOIN
,因为总有一个)。接下来我选择所有匹配的投票。您必须使用LEFT JOIN
来选择没有匹配投票的项目(JOIN
会将其删除,尝试不使用GROUP BY
来掌握差异)。然后我GROUP BY
设计并可以按HAVING
计算。
请注意,由于GROUP BY
语句而导致的此连接会让您成为随机用户,因为每个设计有多个投票,因此有多个用户。所以我把它留了出来。你为什么需要它? (请留下我对你要做的事情的评论)
对于那些对photos
感到疑惑的人,请看一下评论:
每个设计都有一张照片,每个投票都来自用户。所以表 照片有“desing_id”,Desing有“photo_id”。然后投票了 “user_id”和Design有“vote_id”
要了解有关联接的更多信息: