Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL语句问题-内部连接、与GROUP BY和MAX的左连接_Mysql - Fatal编程技术网

MYSQL语句问题-内部连接、与GROUP BY和MAX的左连接

MYSQL语句问题-内部连接、与GROUP BY和MAX的左连接,mysql,Mysql,我这辈子都不能让这句话起作用 SELECT max(pm.timestamp), pm.id, pm.p_media_user_id, pm.p_media_type, pm.p_media_file, pm.wall_post, pm.p_media_location,pm.p_media_location_name, pm.p_media_category, pa.p_source_alert_id, pa.post_id, pa.p_target_alert_id, pu.fb_id

我这辈子都不能让这句话起作用

SELECT max(pm.timestamp), pm.id, pm.p_media_user_id, pm.p_media_type, 
pm.p_media_file, pm.wall_post, pm.p_media_location,pm.p_media_location_name, 
pm.p_media_category, pa.p_source_alert_id, pa.post_id, pa.p_target_alert_id, 
pu.fb_id, pu.username, pu.city, pu.sex, pu.main_image 

FROM p_media as pm 

INNER JOIN p_users as pu ON pm.p_media_user_id = pu.fb_id 

LEFT JOIN p_alerts as pa ON pm.id = pa.post_id AND pa.p_source_alert_id ='3849084' 

group by pm.p_media_user_id;
我唯一有问题的是max(pm.timestamp),在分组之后,我希望它显示p_media表中最新的行,但与此相反,它做的恰恰相反,显示的是最旧的行。因此,我需要来自p_media表的最新行,这些行按照加入p_users表的用户id分组


如果有人帮助,请提前感谢。

您应该能够在分组后添加ORDER BY,并告诉SQL您要按[ASC或DESC]排序的列

SELECT max(pm.timestamp), pm.id, pm.p_media_user_id, pm.p_media_type, 
pm.p_media_file, pm.wall_post, pm.p_media_location,pm.p_media_location_name, 
pm.p_media_category, pa.p_source_alert_id, pa.post_id, pa.p_target_alert_id, 
pu.fb_id, pu.username, pu.city, pu.sex, pu.main_image 

FROM p_media as pm 

INNER JOIN p_users as pu ON pm.p_media_user_id = pu.fb_id 

LEFT JOIN p_alerts as pa ON pm.id = pa.post_id AND pa.p_source_alert_id ='3849084' 

group by pm.p_media_user_id
ORDER BY pm.p_media_user_id DESC;

您的查询没有执行您认为它正在执行的操作。使用
GROUP BY
时,只有
GROUP BY
子句中出现的列才能在
SELECT
中使用,而无需使用聚合函数。将
分组依据
子句中未包含的所有列添加到
选择
时必须在聚合函数中使用

这是标准,对于所有遵循标准的数据库,您将从查询中得到一个错误。出于某种原因,MySQL决定不遵循这方面的标准,并且不会返回任何错误。这真的很糟糕,因为您的查询将运行,但结果无法预测。因此,您会认为该查询很好,并且会想知道为什么会得到错误的结果,而实际上您的查询是无效的

MySQL终于解决了这个问题,并且成功了。他们给出的理由相当愚蠢:因为分组处理已经变得更加复杂,可以检测函数依赖关系。但至少他们改变了默认设置,从MySQL 5.7.5开始,它的行为将与大多数其他数据库一样。对于早期版本,如果您有权更改设置,我建议启用
ONLY\u FULL\u GROUP\u BY
,这样您就可以在此类无效查询中得到一个明确的错误

在某些情况下,如果所有值都完全相同,那么您实际上并不关心为非聚合列返回的值。要让查询在启用
仅\u FULL\u GROUP\u BY
时通过,请在这些列上使用
ANY\u VALUE()
函数。这是一个更好的方法,因为它清楚地表明了您的意图

要了解如何修复查询,请阅读。您需要使用在分组中选择的
p\u media\u用户id
MAX(timestamp)
自动加入
p\u media\u表:

SELECT pm.timestamp, pm.id, pm.p_media_user_id, pm.p_media_type, pm.p_media_file,
       pm.wall_post, pm.p_media_location, pm.p_media_location_name, pm.p_media_category,
       pa.p_source_alert_id, pa.post_id, pa.p_target_alert_id,
       pu.fb_id, pu.username, pu.city, pu.sex, pu.main_image 
FROM p_media as pm
INNER JOIN (SELECT p_media_user_id, MAX(timestamp) AS max_time
            FROM p_media
            GROUP BY p_media_user_id
           ) pmm ON pm.p_media_user_id = pmm.p_media_user_id
                AND pm.timestamp = pmm.max_time
INNER JOIN p_users AS pu ON pm.p_media_user_id = pu.fb_id 
LEFT JOIN p_alerts AS pa ON pm.id = pa.post_id
                        AND pa.p_source_alert_id = '3849084';

正如其他人已经指出的,您正在通过
p\u media\u user\u id
列进行聚合,但随后选择其他非聚合列。这要么根本不会运行,要么会运行,但会产生非决定性的结果。但是,对于每个
p\u media\u用户id
,您似乎只需要从
p\u media
表中获取最新记录。 如果是这样,那么这似乎就是您想要运行的查询:

SELECT
    pm1.timestamp, pm1.id, pm1.p_media_user_id, pm1.p_media_type, pm1.p_media_file,
    pm1.wall_post, pm1.p_media_location, pm1.p_media_location_name, 
    pm1.p_media_category, pa.p_source_alert_id, pa.post_id, pa.p_target_alert_id,
    pu.fb_id, pu.username, pu.city, pu.sex, pu.main_image 
FROM p_media as pm1
INNER JOIN
(
    SELECT p_media_user_id, MAX(timestamp) AS max_timestamp
    FROM p_media
    GROUP BY p_media_user_id
) pm2
    ON pm1.p_media_user_id = pm2.p_media_user_id AND
       pm1.timestamp = pm2.max_timestamp
INNER JOIN p_users AS pu
    ON pm1.p_media_user_id = pu.fb_id 
LEFT JOIN p_alerts AS pa
    ON pm1.id = pa.post_id AND
       pa.p_source_alert_id = '3849084';

这是行不通的,因为这只会对当前的结果进行排序,而这些结果都是错误的。例如,我要返回ID 54、55、58,并且我需要返回每个用户ID组的最新ID,即100、104、103,因此order by将只更改54、55、58的升序或降序结果。尽管这两个数据库都不会运行,但很遗憾,它会在MySQL中运行,但在几乎所有其他数据库中都会出现错误。我说“悲伤”,因为这隐藏了错误,使它更难被发现。MySQL在他们的文档中将其称为标准的扩展。@RacilHilan如果启用
仅\u FULL\u GROUP\u BY
模式(或者如果启用
ANSI
模式,其中包括前者),它将不会在MySQL上运行。啊,现在我明白你这句话的意思了。你应该在回答中加上解释。大多数MySQL安装不会更改默认设置。好消息!MySQL终于解决了这个问题,并且成功了。他们给出的理由相当愚蠢,因为分组处理已经变得更加复杂,可以检测函数依赖关系。但至少他们改变了默认设置,从MySQL 5.7.5开始,它的行为将与大多数其他数据库一样。