Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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未按要求工作而左加入、分组和排序_Mysql - Fatal编程技术网

MySQL未按要求工作而左加入、分组和排序

MySQL未按要求工作而左加入、分组和排序,mysql,Mysql,我有一张桌子 'products' => ('product_id', 'name', 'description') 还有一张桌子 'product_price' => ('product_price_id', 'product_id', 'price', 'date_updated') 我想执行类似这样的查询 SELECT `p`.*, `pp`.`price` FROM `products` `p` LEFT JOIN `product_price` `pp` ON `

我有一张桌子

'products' => ('product_id', 'name', 'description') 
还有一张桌子

'product_price' => ('product_price_id', 'product_id', 'price', 'date_updated')
我想执行类似这样的查询

SELECT `p`.*, `pp`.`price` 
FROM `products` `p` 
LEFT JOIN `product_price` `pp` ON `pp`.`product_id` = `p`.`product_id`
GROUP BY `p`.`product_id` 
ORDER BY `pp`.`date_updated` DESC
你可能猜到价格经常变动,我需要拿出最新的一个。问题是我无法确定如何对左联接表进行排序。我尝试使用一些GROUPBY函数,如MAX,但这只会拉出列而不是行


谢谢。

我认为您需要正确设置别名,并设置您要加入的内容:

SELECT p.*, pp.price 
FROM products AS p 
LEFT JOIN product_price AS pp
ON pp.product_id = p.product_id 
GROUP BY p.product_id 
ORDER BY pp.date_updated DESC

这将为您提供最新更新的价格:

select
  p.*, pp.price
from
  products p,
  -- left join this if products may not have an entry in prodcuts_price
  -- and you would like to see a null price with the product
  join 
  (
      select 
        product_price_id, 
        max(date_updated) 
      from products_price
      group by product_price_id
   ) as pp_max
    on p.product_id = pp.product_id
  join products_price pp on 
    pp_max.prodcuts_price_id = pp.products_price_id
似乎不可能通过汇总在一组上使用ORDER BY。我的基本逻辑有缺陷。我需要运行以下子查询

SELECT `p`.*, `pp`.`price` FROM `products` `p` 
LEFT JOIN (
    SELECT `price` FROM `product_price` ORDER BY `date_updated` DESC
) `pp` 
ON `p`.`product_id` = `pp`.`product_id`
GROUP BY `p`.`product_id`;
这会对性能造成影响,但由于每行都是相同的子查询,因此不会太糟糕。

Mysqlism:

SELECT p.*, MAX(pp.date_updated), pp.price 
FROM products p 
LEFT JOIN product_price pp ON pp.product_id = p.product_id
GROUP BY p.product_id 
将在一些RDBMS上工作:

SELECT p.*, pp.date_updated, pp.price 
FROM products p 
LEFT JOIN product_price pp ON pp.product_id = p.product_id
WHERE (p.product_id, pp.date_updated) 

   in (select product_id, max(date_updated) 
       from product_price 
       group by product_id)
将适用于大多数RDBMS:

SELECT p.*, pp.date_updated, pp.price 
FROM products p 
LEFT JOIN product_price pp ON pp.product_id = p.product_id

WHERE EXISTS
(
    select null -- inspired by Linq-to-SQL style :-)
    from product_price 

    WHERE product_id = p.product_id 

    group by product_id

    HAVING max(date_updated) = pp.date_updated
)
将在所有RDBMS上工作:

SELECT p.*, pp.date_updated, pp.price 
FROM products p 
LEFT JOIN product_price pp ON pp.product_id = p.product_id

LEFT JOIN 
(
    select product_id, max(date_updated) as recent 
    from product_price 
    group by product_id
) AS latest 
ON latest.product_id = p.product_id AND latest.recent = pp.date_updated
如果nate c的代码意图是只从product_price中获取一行,则不需要表派生,即将select product_price_id、maxdate_从products_price中更新为pp_max,他也可以简化。无需使用product_price_id代理主键,如下所示:

SELECT p.*, pp.date_updated, pp.price 
FROM products p 
LEFT JOIN product_price pp ON pp.product_id = p.product_id
WHERE pp.date_updated = (select max(date_updated) from product_price)

你能解释一下你希望发生什么吗?您想按组中的最大值订购吗?是否仅使用最新更新加入?也许一些示例数据和该数据的预期输出将有助于澄清您的问题。我有一个产品,有5种不同的价格,其中有不同的“日期更新”日期时间。我需要加入并获取最新的价格。这是一个更大查询的简化。我不能使用内部联接,因为在实际查询中,我联接到许多表,并使用IF选择NOT NULL列。这可能会起作用,但我确实希望避免执行子查询,因为我有一个大数据集。这是提供正确结果的方法。其他查询将给出所有价格。但是,如果他们工作得更快,那就用对了…?@!感谢您的帮助,但我的查询并没有给出所有的价格,它只是给了我一个随机的价格,我希望通过正确排序来解决这个问题。@Simon,即使使用分析,如果只有MySQL支持它们,您仍然需要一个子查询。这个查询的输出是什么?选择product_price_id,如果逻辑/意图明确,则从products_price更新的maxdate_将取消投票。看来回答错了谢谢。我错过了那一部分。我已经编辑了我的查询。我认为AS部分是可选的。你的Mysqlism不起作用。这就是本文的重点。选择的价格不必如此,尽管它可能会选择与最长日期一致的价格。最后一个查询与我的意图无关。这就是问题所在,您的子查询中缺少GROUPBY子句;因此,它自然只会拾取一行。然后在子查询中添加一个GROUPBY,使用product\u price\u id;我可以冒昧地猜测product\u price\u id是一个代理主键,而且,它是一个顺序id,这是什么意思?为什么在一个表的每一行上使用“按唯一性分组”?这太荒谬了。关于Mysqlism,我不确定我的答案,我的盒子上没有MySQL,我认为MySQL GROUP BY有超能力,我认为它有Postgresql独特的功能,你的第一个答案让我想到:-/也许你应该把MySQL放在盒子上,而不是仅仅为MySQL的问题编造答案!我以前知道MySQL,我也知道很多正确的MySQL。你提到的GROUP BY没有其他字段,我很清楚,事实上,Postgresql正在接受它,有一个转折点,Postgresql以一种可控的方式来做。Postgres仍然是有纪律的。我刚才问了一个类似的问题,得到了@Gordon Linoff的回答