我是mysql的初学者。以下代码看起来很愚蠢,但这就是我的代码无法工作的原因。我以为它会给我 n 行。但是,它只给了我一排。假设表seat
中有 n 行,并且有两个字段,包括 id , student 。
我理解count(*)将返回一个数字。我认为,对于每一行,sql将检查id是否等于总行数。但它没有。
select id = count(*) as id, student
from seat
以下代码符合我的要求。谁能解释是什么让他们得到不同的结果?
select id = count2 as id, student
from seat, (select count(*) as count2 from seat) seat2
答案 0 :(得分:0)
我认为你应该尝试这样的事情:
select id = (select count(*) from seat) as id, student
from seat
基本上你在FROM子句(select count(*) as count2 from seat)
中使用此语句的先前请求只给你一行,因此它不能与你的所有行进行比较,因为你把它放在你的FROM子句中两个表座位和seat2没有相同的行数。
我认为你不需要使用两张桌子。
答案 1 :(得分:0)
一种方式:
set @num := (select count(*) from seat);
select
id
, student
, case when id = @num then 'special' else 'normal' end as x
from seat
另一种方式:
select
id
, student
, case when id = x.y then 'special' else 'normal' end as x
from seat
cross join (select count(*) as y from seat) as x
;
NB :在这两个示例中,您需要子查询在一行中只返回一个值。
答案 2 :(得分:0)
鉴于
+----+----------+
| id | lastname |
+----+----------+
| 1 | aaa |
| 2 | bbb |
| 3 | ccc |
+----+----------+
3 rows in set (0.00 sec)
您的第一个查询是指向mysql的指令,以计算整个集合
MariaDB [sandbox]> select id = count(*) as id, lastname
-> from users;
+------+----------+
| id | lastname |
+------+----------+
| 0 | aaa |
+------+----------+
1 row in set (0.00 sec)
显然,这不会返回最后一个ID或正确的计数。此
将返回正确的计数select id, lastname , count(*)
from users;
+------+----------+----------+
| id | lastname | count(*) |
+------+----------+----------+
| 1 | aaa | 3 |
+------+----------+----------+
1 row in set (0.00 sec)
id和lastname是不确定的。
您的第二个查询会返回笛卡尔积
select id = count2, lastname, count2
-> from users, (select count(*) as count2 from users) seat2
-> ;
+-------------+----------+--------+
| id = count2 | lastname | count2 |
+-------------+----------+--------+
| 0 | aaa | 3 |
| 0 | bbb | 3 |
| 1 | ccc | 3 |
+-------------+----------+--------+
3 rows in set (0.00 sec)
它再次无法识别与计数相匹配的ID ..
假设id是一个数字,并以某种方式递增,找到最后一个id的方式是
MariaDB [sandbox]> select id,lastname
-> from users
-> where id = (select count(*) from users);
+----+----------+
| id | lastname |
+----+----------+
| 3 | ccc |
+----+----------+
1 row in set (0.00 sec)
但这很危险 - 如果id是auto_increment,那么行数可能与id不匹配,因为处理auto_increment的方式(可以覆盖它,在重复键上插入更新等) 更安全的方法是
MariaDB [sandbox]> select id,lastname
-> from users
-> where id = (select max(id) from users);
+----+----------+
| id | lastname |
+----+----------+
| 3 | ccc |
+----+----------+
1 row in set (0.00 sec)
答案 3 :(得分:0)
我认为[count(*)]会给我n行。但是,它只给了我一排。
不。您使用的COUNT(*)
没有GROUP BY
。这使您的查询成为聚合查询。没有GROUP BY
总是的聚合查询会返回一行 - 即使表中没有行也是如此。
您的查询几乎在任何其他数据库(以及MySQL未来版本的默认配置)中都无效,因为您有一个聚合查询,id
列不在GROUP BY
中聚合函数的参数。
在MySQL中,可能是执行您想要使用子查询的最简单方法:
select id = (select count(*) from seat) as id, student
from seat
我不知道您为什么要调用布尔结果id
,但这就是原始查询所表达的内容。
结论:您需要练习聚合查询并查找GROUP BY
所做的事情。