1

製品テーブルがあり、product_id があります。また、グループのようなテーブルがあります。まあ言ってみれば:

Product table(product):
ID  NAME
1 - Shoes
2 - T-shirt
3 - apple
4 - any thing
5 - lorem ipsum
_______________________________________________
Group product table(g_product):
ID   -   GROUP ID    -   PRODUCT ID
1            1               1
2            1               2
3            1               5

各グループから 1 つの製品だけを取得するクエリが必要です。私はこれを試しました:

select * from product as p
left join g_product as g on p.id = g.fk_prod
group by group_id

しかし、これはグループ化された製品だけをもたらします。

私はこの結果を望んでいません:

1 - Shoes
3 - apple
4 - any thing

これはグループ 1 の製品 1 であり、3 と 4 はグループ化されていません。

このクエリで動作すると思います:

select * from product as p
left join g_product as g on p.id = g.fk_prod
group by g.group_id
union
select * from product as p
left join g_product as g on p.id != g.fk_prod
group by p.id

しかし、これを実行するには 30 秒かかります。私はこれを速くする方法があることを知っています。しかし、私は理解できません

4

2 に答える 2

1

このクエリを使用して、適切な結果を取得します

SELECT p.*, 
(CASE WHEN  g.gid IS NOT NULL THEN g.gid ELSE -1*p.id END) AS temp_group_id
FROM product AS p
LEFT JOIN g_product AS g ON p.id = g.fk_prod
GROUP BY temp_group_id

ここで、製品がどのグループにも属していない場合、ダミーのグループ ID (-1*p.id) を割り当てます。そしてそれがトリックを作る

于 2013-10-03T14:10:09.113 に答える