繁体   English   中英

将MySQL查询重构为单个查询

[英]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_*用于新代码,请转到mysqliPDO

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM