[英]Refactoring MySQL queries to a single query
有没有一个很好的方法来做到这一点。
基本上我有一百行,我正在按升序排列以查找最受欢迎的。 如果最小不是唯一的,那么我显然会关注子集的大小-具有相等“ pop”(人气排名)的行数。 为了确定这个子集的大小,我有以下代码。
但是,作为一个新手,我意识到它似乎有些笨拙。
$leastpop = mysql_query(" SELECT * FROM homepage ORDER BY pop ASC LIMIT 1 ");
$pop = mysql_fetch_array($leastpop);
$check = mysql_query("SELECT * FROM homepage WHERE pop = '$pop'");
$count = mysql_num_rows($check);
if($count>=1)
{
//find the element with the corresponding "oldest date"
}
就目前情况而言,由于担心重复相同的笨拙查询,我什至没有尝试确定子集中的“最旧日期”,如果该子集的大小证明大于1。
有没有更好,更有效的方法来解决此问题? 我希望我已经足够清楚了。 干杯。
也许按照以下方式尝试查询会有所帮助:
select pop, count(*), min(date_field) from homepage group by pop order by pop ASC limit 1;
这将为您提供最不流行的流行音乐,其中包含该流行音乐的行数和最早的日期(最短日期)。 这些函数称为聚合函数,因为它们只是这样做。
如果可能,不要mysql_*
用于新代码,请转到mysqli
或PDO
。
SELECT h1.* FROM homepage h1
LEFT JOIN homepage h2
ON h2.pop <= h1.pop AND h2.date_column <= h1.date_column
WHERE h2.id IS NULL;
假设您想要最不受欢迎且日期最早的日期,则只需要一个(简单...)查询:
SELECT * FROM homepage ORDER BY pop, insert_date LIMIT 1
如果有多个记录符合相同的条件,则mysql只会给您找到的第一个记录。 如果还不够具体,则您必须添加更多条件; 使用WHERE
或向ORDER BY
子句添加更多字段。
并且如前所述,不推荐使用mysql_*
函数,因此您应该切换到PDO或mysqli。
您还可以使用子查询:
$check = mysql_query("SELECT * FROM homepage WHERE pop IN (SELECT h2.pop FROM homepage AS h2 ORDER BY h2.pop ASC LIMIT 1)");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.