MYSQL GROUP BY和ORDER BY未按预期一起工作

qyzbxkaa  于 2023-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(109)

我会尝试用两个例子来解释我的问题:
1.当我在查询中只使用ORDER BY子句时:看第一张图。

1.当我同时使用GROUP BY和ORDER BY claluse时:见第二张图片

我的要求是每个酒店只能有一个记录,没有重复,第二次订购应该是最低的酒店价格应该在顶部;
我的意思是记录,我需要记录将third_party_rate拉为1041
您可以查看文本格式的MySQL代码,如下所示:

SELECT h.hotel_id AS id,h.hotel_city AS city,h.hotel_name AS hotelname,h.hotel_star AS hotelcat,hwd.double_spl_rate, hwd.extra_bed_spl_rate,hwd.meal_plan_spl,hwd.third_party_rate,hwd.third_party_extra_bed, hwd.third_party_meal_plan,hwd.room_category,hrd.hotel_rate_from,hrd.hotel_rate_to FROM hotels_list AS h 
INNER JOIN hotel_rate_detail AS hrd ON h.hotel_id = hrd.hotels_id 
INNER JOIN hotel_week_days AS hwd ON hrd.hotel_id = hwd.h_id 
WHERE ( ('2015-07-02' BETWEEN hrd.hotel_rate_from AND hrd.hotel_rate_to) OR ('2015-07-03' BETWEEN hrd.hotel_rate_from AND hrd.hotel_rate_to) ) AND (h.hotel_city = '1')
AND (hwd.double_spl_rate != 0 OR hwd.third_party_rate != 0) AND (h.hotel_star <= '2') 
AND h.hotel_id = 364
GROUP BY h.hotel_id ORDER BY hwd.double_spl_rate,hwd.third_party_rate ASC;

请注意,我在上面的上下文中只使用了id = 364,只是为了显示结果,但还有许多其他重复的酒店id具有这种情况,所以我需要一个通用的查询,不仅适用于id = 364,而且适用于其他id,以便我用一个查询得到完整的结果。

vyu0f0g1

vyu0f0g11#

MySQL将允许这类愚蠢的查询,其中假定GROUP BY包含所有列,即使您没有指定它们。分组是首先完成的,因此如果只有一个结果,则排序不起任何作用。
您需要使用MIN(third_party_rate)来获取该列的最小值。

yebdmbv4

yebdmbv42#

在SQL中,分组是在排序完成之后首先完成的。
所以在这种情况下,你可以先order你的记录。将结果与您的特定列分组,它将返回您想要的任何给定记录。你可以用你的查询像.如下所示替换您的查询:
例如

select * from 
  (select * from table_name order by column_name Asc) 
  as t group by t.column_name_for_group

你的问题,因为我认为这可以帮助你实现你的记录:

Select * from (SELECT h.hotel_id AS id,h.hotel_city AS city,h.hotel_name AS hotelname,h.hotel_star AS hotelcat,hwd.double_spl_rate, hwd.extra_bed_spl_rate,hwd.meal_plan_spl,hwd.third_party_rate,hwd.third_party_extra_bed, hwd.third_party_meal_plan,hwd.room_category,hrd.hotel_rate_from,hrd.hotel_rate_to FROM hotels_list AS h 
INNER JOIN hotel_rate_detail AS hrd ON h.hotel_id = hrd.hotels_id 
INNER JOIN hotel_week_days AS hwd ON hrd.hotel_id = hwd.h_id 
WHERE ( ('2015-07-02' BETWEEN hrd.hotel_rate_from AND hrd.hotel_rate_to) OR ('2015-07-03' BETWEEN hrd.hotel_rate_from AND hrd.hotel_rate_to) ) AND (h.hotel_city = '1')
AND (hwd.double_spl_rate != 0 OR hwd.third_party_rate != 0) AND (h.hotel_star <= '2') 
AND h.hotel_id = 364
ORDER BY hwd.double_spl_rate,hwd.third_party_rate ASC) as result_table GROUP BY result_table.id;
flseospp

flseospp3#

我在php上使用了一个单独的方法来获取id并将其放入数组中。然后在另一个SQL查询中,我通过查找ID来搜索数据

$ids  = array();

$sql = "SELECT pid FROM table_name  WHERE DATE(column_name)='yyyy-mm-dd'  ORDER BY column_name ASC";

$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {

if (!in_array($row['value'], $ids)) {
    array_push($ids, $row['value']);
}
    }
}

然后呢

$sql = "SELECT * FROM table_name WHERE id IN (".implode(',', $ids).") ORDER BY column_name ASC";

相关问题