2015-06-08 83 views
2

我有一个表结构是这样的:组通过与顺序的MySQL通过

库存表

id stock 
1 0 
2 113 
3 34 
4 50 

产品表(这两个表与ID列连接)

id parid name 
1 1  A 
2 1  B 
3 2  C 
4 3  D 

我在我的查询中使用了组parid,这是我的项目需求。

查询:

select * 
from products as p inner join 
    stock as s on p.id=s.id 
group by parid 
order by stock DESC 

它显示结果为:

id parid name 
4 3  D 
3 2  C 
1 1  A 

我要的是:

Group by应根据产品大小排序的股票包括产品。

所以查询应取下面的结果,而不是上面的一个:

id parid name 
4 3  D 
3 2  C 
2 1  B 

任何帮助将不胜感激。

这可能是一个答案

使用下面的两个答案,我想出了下面的查询其目前似乎解决了问题(仍然需要检查多例)。

SELECT * FROM products p inner join stock i on p.id=i.id inner join (select max(stock) maxstock,parid from products inner join stock on products.id=stock.id group by parid) q on q.parid=p.parid and q.maxstock=i.stock group by p.parid

+0

什么是这些表之间的关系?加入s.id = p.id? –

+0

关系是一个是产品表,另一个是库存表。对于每个产品,都有库存表。 –

+0

是的,看起来像一个小错字。什么是parid?也许如果我更好地理解它,它可以帮助我想出一个解决方案。 – FrankerZ

回答

3

尝试运行此:

select * 
from products as p inner join 
    stock as s on p.id=s.id 
where stock in (select max(stock) from products as p inner join 
    stock as s on p.id=s.id group by parid) 
group by parid 
order by stock desc 
+0

我不认为有任何直接的方法来解决这个问题。这只是一个初始,我想尽可能提供更好的东西。 –

+0

这是丑陋的,但这是满足他的需求的解决方案ATM – FrankerZ

+0

我想是的,你知道我想说什么,这可能会解决这个问题。 –

0

考虑下面的中间结果:

SELECT p.* 
    , s.stock 
    FROM products p 
    JOIN stock s 
    ON s.id = p.id 
+------+-------+------+-------+ 
| id | parid | name | stock | 
+------+-------+------+-------+ 
| 1 |  1 | A | 113 | 
| 2 |  1 | B | 113 | 
| 3 |  2 | C |  0 | 
| 4 |  3 | D | 50 | 
+------+-------+------+-------+ 

什么是选择行ID 2而不是排ID为1的标准是什么?

根据您的意见,我认为我以前的答案是正确的。如果这是错误的,那是因为你对问题的表述是错误的。

SELECT p.* 
    , s.stock 
    FROM products p 
    JOIN stock s 
    ON s.id = p.id 
    JOIN 
    (SELECT p.parid 
      , MAX(stock) max_stock 
     FROM products p 
     JOIN stock s 
      ON s.id = p.id 
     GROUP 
      BY p.parid 
    ) y 
    ON y.parid = p.parid 
    AND y.max_stock = s.stock; 

扩展这一想法解决的联系,我们可以用另一种方法......

SELECT a.* 
    FROM 
    (SELECT p.* 
      , s.stock 
     FROM products p 
     JOIN stock s 
      ON s.id = p.id 
     JOIN 
      (SELECT p.parid 
        , MAX(stock) max_stock 
       FROM products p 
       JOIN stock s 
        ON s.id = p.id 
       GROUP 
        BY p.parid 
      ) y 
      ON y.parid = p.parid 
      AND y.max_stock = s.stock 
    ) a 
    LEFT 
    JOIN 
    (SELECT p.* 
      , s.stock 
     FROM products p 
     JOIN stock s 
      ON s.id = p.id 
     JOIN 
      (SELECT p.parid 
        , MAX(stock) max_stock 
       FROM products p 
       JOIN stock s 
        ON s.id = p.id 
       GROUP 
        BY p.parid 
      ) y 
      ON y.parid = p.parid 
      AND y.max_stock = s.stock 
    ) b 
    ON b.parid = a.parid 
    AND b.id < a.id 
WHERE b.id IS NULL; 
+------+-------+------+-------+ 
| id | parid | name | stock | 
+------+-------+------+-------+ 
| 1 |  1 | A | 113 | 
| 3 |  2 | C |  0 | 
| 4 |  3 | D | 50 | 
+------+-------+------+-------+ 
+0

你不应该在任何地方使用'MAX(name)'。他正在试图用最大股票,而不是最大名称... – FrankerZ

+0

加入不能在'parid'列上,'stock'表中没有这样的列 –

+0

没有,没有给出正确的结果。多个条目将用于parid,而group by应只能获取一个。 –