从SQL表中选择百分之几的行?

7

我有一个包含PHP脚本的网站,这个脚本里面有一个SQL查询,返回的数据可以被JavaScript文件访问。数据是一个庞大的航班数据列表,我需要能够选择(假设)任何给定日期的总航班数的随机40%。为了论证,我们可以这样说:

$query = "SELECT * FROM `Flight_Data` WHERE DepDateTimeUTC LIKE '%1/1/14%' ";

我了解要想获取随机行数只需要使用 ORDER BY RAND() LIMIT 40,但最好是可以使用LIMIT 40%来实现,不过这样做是不起作用的。

编辑:

$query = "SELECT * FROM `Flight_Data` WHERE DepDateTimeUTC LIKE '%1/1/14%' ";
$row = mysqli_fetch_row($result);
$total = $row[0];
$percent = $total * 0.40;
$query = "SELECT * FROM `Flight_Data` WHERE DepDateTimeUTC LIKE '%1/1/14%' LIMIT . $percent ";

7
您可以使用一个解决办法,选择计算所有记录的总数,在PHP中计算40%,并将其用作另一个查询中的限制。 - Marco Mura
1
@MarcoMura已经明白了。这基本上就是这里所说的(第三个谷歌搜索项)。 - crthompson
1
取决于具体实现。一些SQL99的实现(例如PostgreSQL)支持在LIMIT参数中使用表达式。或者,如果支持的话,SQL2008的FETCH ONLY语法绝对允许使用表达式。 - BadZen
1
在 mysql(官方网站)上,只能直接使用整数进行 LIMIT,不能进行计算(即使是 1+1 也不行)。 - Marco Mura
@mekk33 如果你想要送我礼物的地址,我们可以聊一聊 :P - Marco Mura
显示剩余11条评论
2个回答

4
你可以使用以下方法对所有记录进行COUNT,然后计算所需%
$query = "SELECT COUNT(*) FROM `Flight_Data` WHERE DepDateTimeUTC LIKE '%1/1/14%' ";
$result = mysqli_query($connection,$query);
$row = mysqli_fetch_row($result));

$total = $row[0];
$percent = intval($total * 0.40);

$query = "SELECT * FROM `Flight_Data` WHERE DepDateTimeUTC LIKE '%1/1/14%' LIMIT ". $percent;
//execute your query....

谢谢,我现在正在尝试!为了存储总数,我使用以下代码:$total = mysql_fetch_row($query); 这样正确吗? - mekk33
尝试这样写:$row = mysql_fetch_row($resource); $total = $row[0]; - Ragnar
请使用mysqli_函数,因为所有带有前缀mysql_的函数都已被弃用。 - Ragnar
你也可以在第一个查询中删除'和"之间的空格,位于查询末尾。 - Marco Mura
在 mysqli_fetch_row 之前执行查询 $result = mysqli_query($connection,$query); - Ragnar
2
$percent 可能包含小数,因此您应将其转换为整数。 - FuzzyTree

3

由于您正在使用php脚本,因此您应该能够实现您想要的功能。您可以做的是获取表中的总行数,如下所示:

SELECT count(*) AS Total FROM Flight_Data

使用php可以计算该总数的40%。

假设$myPercent包含计算出的总数的40%。您可以在限制中使用$myPercent的值

$query = "SELECT * FROM `Flight_Data`  
WHERE DepDateTimeUTC LIKE '%1/1/14%'  
LIMIT ".$myPercent;

在这里,我们将php变量从mysql查询字符串中进行了转义,这是一个好的做法。

在mysql中,%被用作通配符,所以它不能像你想象中的那样在limit语句中使用。

希望这对你有所帮助。


你忘记了rand函数。 - Marco Mura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接