6

製品の表があります:

CREATE TABLE products (`id` INT);

そして、それらの製品の画像の表:

CREATE TABLE images (`id` INT, `product_id` INT, `default` TINYINT(1));

defaultすべての製品を選択し、( = 1) の画像が優先されるように画像テーブルを結合する必要があります。製品に ( = 1) の画像がない場合はdefault、( default= 0) の画像がその場所。


ここに私が探しているものを示す画像があります:

ここに画像の説明を入力


今、私はこのクエリを持っています:

SELECT p.id, i.id
FROM products AS p
LEFT JOIN (
    SELECT product_id, url
    FROM images
    ORDER BY default
) AS i
ON p.id = i.product_id
GROUP BY p.id
ORDER BY p.name

「デフォルト」の画像を優先しません。サブクエリは何もしていないようです。

4

4 に答える 4

2

SQLFiddle デモ

select products.id,
       coalesce(t1.mid,t2.mid) as image_id      

from products
left join (select min(id) mid,product_id 
                  from images where `default`=1
                  group by product_id ) t1
        on products.id=t1.product_id
left join (select min(id) mid,product_id 
                  from images where `default`=0
                  group by product_id ) t2
        on products.id=t2.product_id
于 2012-12-29T08:07:55.497 に答える
1

サブクエリの ORDER BY で「DESC」が欠落していたようです

:\

于 2012-12-29T07:55:50.973 に答える
0

これを試して:

SELECT 
  p.id productid, 
  IFNULL(i1.id, i2.id)
FROM products    AS p
LEFT JOIN images AS i1  ON p.id = i1.product_id
                       AND i1.`Default` = 1  
LEFT JOIN images AS i2  ON p.id = i2.product_id
                       AND i2.`Default` = 0
GROUP BY p.id;
于 2012-12-29T07:58:07.087 に答える
0

製品の画像を 1 つだけ表示する場合は、次のクエリを試してください -

SELECT p.*, i.* FROM products p
  JOIN (SELECT * FROM images ORDER BY `default` DESC) i
    ON p.id = i.product_id
GROUP BY p.id
于 2012-12-29T07:56:10.410 に答える