2

タイトルがわかりにくかったらすいません…

私は2つのテーブルを持ってproductsおりimages

関連上productsproduct_id= images. product_id

各製品には、imagesテーブルに関連するいくつかの画像があり、

product_order両方のテーブルには、ORDER BY (および)したい列幅の値がありますimage_order

私が探している結果は、製品ごとに 1 つの画像 (および 1 つの結果) のみpublished productsを含むすべてのリストです。画像は列の値が最も低いものである必要があります。image_order

ここで見つけた他の回答から以下のコードをまとめましたが、機能しています。唯一の問題は、列image_orderが重複を許可しているため、同じ製品の同じ値の画像がある場合、image_order製品ごとに複数の結果が得られます.

SELECT products.*, images.image_name, images.image_order

FROM products

LEFT JOIN images ON (
    images.product_id = products.product_id 
    AND images.image_order = (
        SELECT min(image_order) 
        FROM images 
        WHERE product_id = products.product_id
    )
)

WHERE products.published = 1
ORDER BY products.product_order ASC

編集(私のテーブル):

テーブル製品

product_id  |  product_name  |  product_order
____________|________________|_________________
     1      |  Fist Product  |        1
     2      | Second Product |        2
     3      | Third Product  |        3

テーブル画像

 image_id   |   product_id   |    image_name    |  image_order
____________|________________|__________________|_________________
     1      |       1        |  Fist Image URL  |        1
     2      |       1        | Second Image URL |        1
     3      |       2        | Third Image URL  |        1
     4      |       3        | Fourth Image URL |        1

このクエリから得た結果:

  1. 最初の商品 + 最初の画像

  2. 最初の商品 + 2 番目の画像

  3. 2 番目の製品 + 3 番目の画像

  4. 3 番目の製品 + 4 番目の画像

必要な結果:

  1. 最初の商品 + 最初の画像

  2. 2 番目の製品 + 3 番目の画像

  3. 3 番目の製品 + 4 番目の画像

4

1 に答える 1

3

このようなものを使用できますが、これは最良のオプションではありません。テーブルについてさらに知識があれば、より良い答えが得られる可能性があります。

select products.*,
(
    select image_name from images
    where product_id = products.product_id
    order by image_order asc
  limit 1
) as 'image_name'
from products
WHERE products.published = 1
ORDER BY products.product_order ASC
于 2012-12-04T17:10:10.613 に答える