Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 Order by子句在多次联接后表现不正确_Mysql_Sql_Join_Phpmyadmin_Left Join - Fatal编程技术网

Mysql Order by子句在多次联接后表现不正确

Mysql Order by子句在多次联接后表现不正确,mysql,sql,join,phpmyadmin,left-join,Mysql,Sql,Join,Phpmyadmin,Left Join,我的问题是: SELECT DISTINCT `post_data`. * , pv.`seller_id` , pv.`islimited` , pv.`isquantity` , pv.`isslider`, `price`.`original_price` , `price`.`discount_percentage` , `timelimit`.`start_date` , `timelimit`.`expire_date` , `quantity`.`in_stock`, `curre

我的问题是:

SELECT DISTINCT `post_data`. * , pv.`seller_id` , pv.`islimited` , pv.`isquantity` , pv.`isslider`, `price`.`original_price` , `price`.`discount_percentage` , `timelimit`.`start_date` , `timelimit`.`expire_date` , `quantity`.`in_stock`, `currency`.`currency_symbol`, `seller`.`directory`, `post_to_cat`.`cat_id`, count(`sales`.`sales_id`) as sale FROM `post_view` AS pv
INNER JOIN `post_data` ON pv.`post_id` = `post_data`.`post_id` AND pv.`status` = 1 
INNER JOIN `price` ON pv.`post_id` = `price`.`post_id` 
INNER JOIN `currency` ON `price`.`currency_id` = `currency`.`currency_id` 
INNER JOIN `seller` ON pv.`seller_id` = `seller`.`seller_id` 
INNER JOIN `post_to_cat` ON `post_to_cat`.`cat_id` = 1 AND `post_to_cat`.`post_id` = `post_data`.`post_id` 
LEFT JOIN `timelimit` ON ( CASE WHEN pv.`islimited` = 1 THEN `timelimit`.`post_id` ELSE -1 END ) = pv.`post_id`
LEFT JOIN `quantity` ON  ( CASE WHEN pv.`isquantity` = 1 THEN `quantity`.`post_id` ELSE -1 END ) = pv.`post_id`
LEFT JOIN `sales` ON `sales`.`post_id` = pv.`post_id` AND `sales`.`status` = 1 
WHERE pv.`status` = 1
ORDER BY pv.`post_id` DESC LIMIT 1 

orderbydesc
不起作用,它只返回表中的第一行,但我想得到post_id值最高的行。我犯了什么错误?

正如@Alex在评论中所说的那样,您在结尾处有一个
限制1
,为了可读性,您可能应该将最后一个
左连接括起来。

我相信这里的问题主要是由于执行了聚合(使用COUNT())函数,而没有任何分组依据。尽管如此,你似乎并不一定需要它,因为你只想让它在相关帖子中起作用

如果您试图为一篇文章收集所有这些信息,我会调整您的
WHERE
子句,使其有一个条件,只为ID最大的文章收集这些信息

使用子查询获取最大的ID,而不是按ID排序并限制为1,如下所示:

...
WHERE pv.status = 1 AND post_data.slug = 'abc' AND pv.post_id = (SELECT MAX(post_id) FROM post_view);

正如@McAdam331所说,我们需要数据样本和sql fiddle来调查您的查询出了什么问题。但目前我有一些建议如何改进和调试您的查询

首先,我在查询中看到的最左侧的主表是
post_view
,因此,如果希望获得最大id,所有其他表都应该是
left JOIN
。只有当您认为其他表可以以某种方式筛选主表,并且顺序或结果可能依赖于其他表时,才应该使用
内部联接。但在您的情况下,我认为没有理由使用
内部联接

第二点是关于
条件的非常奇怪的

LEFT JOIN `timelimit` ON ( CASE WHEN pv.`islimited` = 1 THEN `timelimit`.`post_id` ELSE -1 END ) = pv.`post_id`
LEFT JOIN `quantity` ON  ( CASE WHEN pv.`isquantity` = 1 THEN `quantity`.`post_id` ELSE -1 END ) = pv.`post_id`
我把它们换成了另一个

CASE WHEN pv.`islimited`=1 THEN `timelimit`.`start_date` ELSE NULL END as start_date ,
CASE WHEN pv.`islimited`=1 THEN `timelimit`.`expire_date` ELSE NULL END as expire_date,
CASE WHEN pv.`isquantity`=1 THEN  `quantity`.`in_stock` ELSE NULL END as in_stock,
但我还是不喜欢。这对我来说似乎很没用。当我读到pv.islimited=1,然后timelimit.start\u date,否则NULL结束为start\u date时没有意义,所以如果flag
pv.islimited=0
您不需要
start\u date
?你确定吗

最后一件事我可以建议:尝试使用我的,甚至是你的查询。但在调试过程中逐步添加每个表。所以第一个问题就是:

SELECT 
pv.`post_id`, pv.`seller_id` , pv.`islimited` , pv.`isquantity` ,
pv.`isslider`
FROM `post_view` AS pv
WHERE pv.`status` = 1 
ORDER BY pv.`post_id` DESC 
LIMIT 1 
如果返回正确的
post\u id
添加下一个表:

SELECT 
pv.`post_id`, pv.`seller_id` , pv.`islimited` , pv.`isquantity` ,
pv.`isslider`, 
`post_data`. * 
FROM `post_view` AS pv
LEFT JOIN `post_data` 
ON pv.`post_id` = `post_data`.`post_id` 
WHERE pv.`status` = 1 
  AND `post_data`.`slug` = 'abc' 
ORDER BY pv.`post_id` DESC 
LIMIT 1 
检查结果。一步一步地继续

是的,这需要时间。但这就是调试过程。这可能是完成查询的最快方法。:-)


编辑1-最后一个
按pv分组。根据@McAdam331关于
count()
函数的通知添加了post\u id
,没有
groupby

你有
count()
函数,没有
groupby
它将只有一行。
限制1
你期望什么?正如你所要求的,它返回1行。是的,但我希望它能返回最后添加的帖子!由于我是按post\u id对desc进行排序,为什么在您的时间限制和数量联接中您要加入pv.post\u id?我觉得这不对,没关系,我只是想理解。我提出了一个建议。如果不起作用,请发布一些示例数据(最好是在一个和预期的结果中,这样我可以尝试重新创建问题。我使用限制1只检索一个结果。这对结果有影响吗?好的,在你的问题中,问题听起来好像是你只得到一个结果,我想你首先想要最高的post_id,就这样?你尝试过使用
MAX吗(pv.post_id)
在您的select语句中,然后按其他列分组?这将是目前的备选方案。谢谢@McAdam331,完全符合我的需要!:)@king4aol不是问题,我很高兴它能帮上忙。如果这是您使用的解决方案,请点击答案旁边的复选标记接受它,以便将来的读者能够看到您问题的解决方案。我怀疑这是正确的解决方案。即使正确检测到问题。您至少可以将其更改为
WHERE post\data、 slug='abc'和pv.post\u id=(从post\u视图中选择MAX(post\u id),其中pv.status=1)
但是你可以看到,如果最后一个post\u id没有加入到
post\u data.slug='abc'
@Alex中,那么即使是这一个也会破坏结果。这是一个非常好的捕获。OP,你能尝试添加一个
分组,然后像你最初那样按降序排列,看看这是否仍然有效吗?我确实编辑了我的答案。等待f或者我猜是@king4aol测试结果。问题由@McAdam331解决。但您的详细建议确实值得赞赏,并将在这方面对我有所帮助,并且可能会有进一步的问题。谢谢:)是的,我明白了。请在他的回答下查看我的评论。只是确保它完全解决了您的问题。祝您的项目好运:-)这些都是非常好的观点,有些我甚至没有想到。Alex是对的,@king4aol,虽然我的查询在这个个案中可能有效,但它有一些潜在的缺陷,你将来可能会看到。如果这是一个任何类型的项目,你将继续使用在未来,我一定要做一些测试,现在,而不是等待它打破。
SELECT `post_data`. * ,
pv.`post_id`, pv.`seller_id` , pv.`islimited` , pv.`isquantity` ,
pv.`isslider`, `price`.`original_price` , `price`.`discount_percentage` , 
CASE WHEN pv.`islimited`=1 THEN `timelimit`.`start_date` ELSE NULL END as start_date ,
CASE WHEN pv.`islimited`=1 THEN `timelimit`.`expire_date` ELSE NULL END as expire_date,
CASE WHEN pv.`isquantity`=1 THEN  `quantity`.`in_stock` ELSE NULL END as in_stock,
 `currency`.`currency_symbol`, `seller`.`directory`, `post_to_cat`.`cat_id`, count(`sales`.`sales_id`) as sale 
FROM `post_view` AS pv
LEFT JOIN `post_data` 
ON pv.`post_id` = `post_data`.`post_id` 
LEFT JOIN `price` 
ON pv.`post_id` = `price`.`post_id` 
LEFT JOIN `currency` 
ON `price`.`currency_id` = `currency`.`currency_id` 
LEFT JOIN `seller` 
ON pv.`seller_id` = `seller`.`seller_id` 
LEFT JOIN `post_to_cat` 
ON `post_to_cat`.`cat_id` = 1 
  AND `post_to_cat`.`post_id` = pv.`post_id` 
LEFT JOIN `timelimit` 
ON `timelimit`.`post_id` = pv.`post_id`
LEFT JOIN `quantity` 
ON quantity`.`post_id` = pv.`post_id`
LEFT JOIN `sales` 
ON `sales`.`post_id` = pv.`post_id` 
  AND `sales`.`status` = 1 
WHERE pv.`status` = 1 
  AND `post_data`.`slug` = 'abc' 
GROUP BY pv.`post_id` 
ORDER BY pv.`post_id` DESC 
LIMIT 1