按顺序列分组

时间:2013-01-18 09:59:32

标签: mysql group-by

这是我的疑问:

SELECT p.*,r.* 
FROM products p 
left join p_images r 
  on (p.id=r.product)

结果:

id | name | img    | nu
25 | shoe | a1.jpg | 1
25 | shoe | a2.jpg | 0
26 | elbs | r3.jpg | 1

我想要这个结果

shoe a2.jpg 0
elbs r3.jpg 1

当我在查询中使用group by p.id时,会输出a1.jpg 我想订购min("nu")列值。

3 个答案:

答案 0 :(得分:2)

您可以使用子查询获取min(nu)值,然后将其加回到p_image表中,以确保返回正确的图像:

select p.id,
  p.name,
  i.img,
  r.minnu
from products p 
left join
(
  select min(nu) MinNu, product
  from p_images
  group by product
) r 
  on p.id=r.product
left join p_images i
  on r.minnu = i.nu
  and r.product = i.product
order by i.nu;

请参阅SQL Fiddle with Demo

结果:

| ID | NAME |    IMG | MINNU |
------------------------------
| 25 | shoe | a2.jpg |     0 |
| 26 | elbs | r3.jpg |     1 |

您只需添加ORDER BY该值即可。由于您使用的是order by子句,因此您可以使用别名,也可以将聚合放入其中。

按别名排序:

SELECT p.id,       p.name,       r.img,       min(r.nu)MinNu     来自产品p     左连接p_images r       在p.id = r.product上     p.id组     由MinNu订购

按汇总排序:

SELECT p.id,       p.name,       r.img,       min(r.nu)MinNu     来自产品p     左连接p_images r       在p.id = r.product上     p.id组     按分钟排序(r.nu);

请参阅两个查询的SQL Fiddle with Demo

结果是:

| ID | NAME | IMG | MINNU |     ------------------------------     | 25 |鞋| a1.jpg | 0 |     | 26 |榆树| r3.jpg | 1 |

<击>

答案 1 :(得分:1)

这是你需要的吗?这里错了,因为我把你早先产生的结果作为表格...:)

SQLFIDDLE DEMO

select id, name, img, 
min(nu)
from t1
group by id
;

所以我不妨根据当时给出答案:

select x.id, x.name, x.img, min(x.nu)
from( 
SELECT p.,r. FROM products p 
left join p_images r 
on (p.id=r.product)) x
group by x.id
order by x.nu

| ID | NAME |    IMG | MIN(NU) |
--------------------------------
| 26 | elbs | r3.jpg |       1 |
| 25 | shoe | a1.jpg |       0 |

你的预期结果是r2.jpg and 0,所以我认为这是你真正需要的......这次使用了正确的表格,感谢@bluefeet为他的sql小提琴。

SQLFIDDLE DEMO

select p.id, p.name, x.img, x.mn
from products p
left join (select i.product, i.img, 
           min(i.nu) mn
           from p_images i
           group by i.nu, i.product)
x on p.id = x.product
group by x.product
order by x.mn
;

| ID | NAME |    IMG | MN |
---------------------------
| 25 | shoe | a2.jpg |  0 |
| 26 | elbs | r3.jpg |  1 |

答案 2 :(得分:1)

尝试:

SELECT * 
FROM products p 
LEFT JOIN p_images r ON (r.product=p.id) 
WHERE r.nu = (SELECT MIN(nu) FROM p_images m WHERE m.product = p.id)
ORDER BY nu