【发布时间】:2020-07-05 22:21:23
【问题描述】:
我正在尝试在我的数据库上运行 SQL 命令。我有两张表,一张用于用户,另一张用于帖子。我想找到每个用户的最后一篇文章。我尝试了以下操作:
SELECT b.`username`, b.`id`, c.`home`, c.`text` FROM `sunlight-users` AS b
LEFT JOIN `sunlight-posts` AS c ON b.`id` = c.`author`
WHERE b.`group` = 1 OR b.`group`=3 OR b.`group`= 5 OR b.`group` = 10 OR b.`group` = 14 OR b.`group` =
23 OR b.`group` = 25
ORDER by c.`time` DESC
GROUP BY b.`username`
失败并出现错误“您的语法在第 5 行的 GROUP BY b.username 附近很奇怪”。
我尝试使用 while 循环(在网页上)运行命令,如下所示:
$query = DB::query("SELECT * FROM `"._mysql_prefix."-users` WHERE `group` = 1 OR `group` = 3 OR `group` = 5 OR `group` = 10 OR `group` = 14 OR `group` = 23 OR `group` = 25");
while($item = DB::row($query)) {
$post = DB::query("SELECT type,home,xhome,author,time FROM `"._mysql_prefix."-posts` WHERE ".$knihy." AND `author` = ".item['id']." ORDER BY `time` DESC LIMIT 1");
switch($post['home']){
case 2:
//code
break;
case 3:
//code
break;
default:
//code
}
但是看起来第二个查询被完全忽略了,即使手动将查询输入数据库得到 2 或 3,我也会得到默认值。我知道在循环中运行 50 个查询可能不是一个好主意,那就是为什么我要一次完成所有事情。 这段代码:
SELECT b.`username`, b.`id`, c.`home`, c.`text` FROM `sunlight-users` AS b
LEFT JOIN `sunlight-posts` AS c ON b.`id` = c.`author`
WHERE b.`group` = 1 OR b.`group`=3 OR b.`group`= 5 OR b.`group` = 10 OR b.`group` = 14 OR b.`group` =
23 OR b.`group` = 25
ORDER by c.`time` DESC
结果
+----+----------+------+------+
| id | username | home | text |
+----+----------+------+------+
| 1 | user1 | 2 | .... |
| 1 | user1 | 3 | aaaa |
| 0 | user0 | 4 | .... |
+----+----------+------+------+
顺序正确,我只想要每个用户的上一行。如有任何帮助,我将不胜感激。
【问题讨论】:
-
用您正在使用的数据库标记您的问题。您还应该学会不要使用关键字,例如
group和time,作为列名。 -
不幸的是,这不是我能做的(我们使用带有默认表和相当复杂系统的 CMS)。
-
SQL 查询的不同部分必须按特定顺序排列。先 SELECT,然后在 WHERE 过滤行,然后 GROUP BY 对剩下的内容进行分组,最后是 ORDER BY。此外,如果您使用 GROUP BY 那么您不能 SELECT 显示不在分组中的列,因为可能有多行表示多个不同的值。您可以在这些列上使用函数来显示最大值或最小值等内容。
标签: mysql sql join greatest-n-per-group