我正在寻找MYSQL QUERY,而不是PLSQL QUERY
select * from aadhar limit (select count(*)/2 from aadhar);
我尝试过这样,但是遇到此错误,请帮忙
错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的'
(select count(*)/2 from aadhar )
'附近使用
答案 0 :(得分:3)
也许不是您想要的,但是- “在存储的程序中,可以从MySQL 5.5.6开始使用整数值的例程参数或局部变量来指定LIMIT参数。” https://dev.mysql.com/doc/refman/5.5/en/select.html
如果您不想使用动态sql或存储过程,但是您确实有某种排序表的方法,那么行号模拟(版本8之前)或row_number窗口函数(版本8以上)可能会有所帮助。给定
+-----+----------+
| id | username |
+-----+----------+
| 1 | aaa |
| 2 | Jane |
| 3 | Ali |
| 6 | Bruce |
| 7 | Martha |
| 8 | Sidney |
| 10 | charlie |
| 12 | Elisa |
| 14 | Samantha |
| 15 | Hannah |
| 16 | Hannah |
| 17 | Kevin |
| 999 | bob |
+-----+----------+
13 rows in set (0.00 sec)
SELECT S.ID,S.USERNAME FROM
(
SELECT U.ID,U.USERNAME,
@RN:=@RN+1 ROWNUMBER,
(SELECT ROUND(COUNT(*)/2) FROM USERS) TOPN
FROM USERS U
CROSS JOIN (SELECT @RN:=0) R
ORDER BY U.ID
) S
WHERE S.ROWNUMBER <= S.TOPN;
将导致
+----+----------+
| ID | USERNAME |
+----+----------+
| 1 | aaa |
| 2 | Jane |
| 3 | Ali |
| 6 | Bruce |
| 7 | Martha |
| 8 | Sidney |
| 10 | charlie |
+----+----------+
7 rows in set (0.00 sec)
答案 1 :(得分:3)
像已经解释过的其他答案LIMIT
一样,不能在查询中动态设置。
但是您可以结合使用MySQL用户变量和PREPARE/
EXECUTE来解决此问题。
SET @count = (SELECT COUNT(*)/2 FROM aadhar);
SET @sql = CONCAT('SELECT * FROM aadhar LIMIT ', @count);
PREPARE q FROM @sql;
EXECUTE q;
DEALLOCATE PREPARE q;
或(最安全的选项)
SET @count = (SELECT COUNT(*)/2 FROM aadhar);
PREPARE q FROM 'SELECT * FROM aadhar LIMIT ?';
EXECUTE q USING @count;
DEALLOCATE PREPARE q;
额外警告
请注意,SQL是出于防御目的无序。在没有LIMIT
的情况下使用ORDER BY
是没有意义的。 SQL可以自由按期望的顺序返回匹配的记录,而无需ORDER BY
,这意味着两次运行相同的查询可能会导致结果不同。
另外,最好使用CEIL()
或CAST()
将双精度值转换为int值,这样当表中的记录数为奇数时,方法不会出错,并且像这样生成带有双精度值的SQL { {1}}
有关如何操作的信息,请参见demo
答案 2 :(得分:2)
除非在LIMIT子句中明确指定标量,否则MySQL中没有规定选择并显示表中总记录的一半。
答案 3 :(得分:0)
尝试一下:
select * from aadhar limit ((select count(*) from aadhar)/2);
count子句返回记录数,该值的一半取作限制。
答案 4 :(得分:0)
您可以使用变量来实现。
SELECT @s:=@s+1 id,a.*
FROM aadhar a,
(SELECT @s:= 0) AS s where @s < (SELECT count(*)/2 from aadhar a2)
这里“ @s”是一个变量,并添加了自动递增的创建ID。 条件存储您的总记录数的一半,而@s在达到记录的一半数的限制后停止。