2016-05-16 16 views
0

MySQLデータベースから結果セットを取得する必要があります。そこには、各アイテムを参照する複数の画像があります。ピクチャにはpicture_noフィールドがあり、その中で最も低い数字が結果と一緒に返りたいものです。あなたが見ることができるように、私は最も小さい番号の画像を取得する方法を見つけ出すことができなかったことから、私は現在AND cp.picture_no = 0を使用しています最低のピクチャ番号でMySQL結果セットを取得する方法は?

SELECT 
    ca.*, 
    ca.ID AS ad_id, 
    ca.cat_id, 
    UNIX_TIMESTAMP(ca.date_edited) AS date, 
    cp.*, 
    ar.area_name 
FROM 
    $DB.$T4 ca 
     LEFT JOIN $T6 AS cp ON ca.ID = cp.classified_id AND cp.picture_no = 0 
     LEFT JOIN $T60 zip ON ca.zip_id = zip.zip_id 
     LEFT JOIN $T3 ar ON zip.area_id = ar.ID 
WHERE 
    ca.extern = 0 
    AND ca.confirmed = 1 
    AND ca.advertiser_id = ".$user['uid']." 
ORDER BY 
    date_created   
LIMIT 10 

は現在、私はこのクエリを使用しています。

どうすればいいですか?関数min()は問題を解決するのに役立たなかった。

+1

アクションのこの単純な二段階のコースを、次の考慮および/またはsqlfiddle)を使用して、問題を簡単に再現できるようにします。 2.まだ実行していない場合は、手順1で提供された情報に対応する結果セットを指定してください。 – Strawberry

+0

'cp'テーブルのすべてのカラムが必要ですか? –

答えて

1

あなたは、この使用することができます

SELECT 
    ca.*, 
    ca.ID AS ad_id, 
    ca.cat_id, 
    UNIX_TIMESTAMP(ca.date_edited) AS date, 
    cp.*, 
    ar.area_name 
FROM 
    $DB.$T4 ca 
     LEFT JOIN (SELECT tmp.* 
        FROM $T6 tmp 
        INNER JOIN (SELECT classified_id, MIN(picture_no) min_picture_no 
           FROM $T6 
           GROUP BY classified_id) tmp1 
        ON tmp.classified_id = tmp1.classified_id 
          and tmp.picture_no = tmp1.min_picture_no 
        ) AS cp 
     ON ca.ID = cp.classified_id 
     LEFT JOIN $T60 zip ON ca.zip_id = zip.zip_id 
     LEFT JOIN $T3 ar ON zip.area_id = ar.ID 
WHERE 
    ca.extern = 0 
    AND ca.confirmed = 1 
    AND ca.advertiser_id = ".$user['uid']." 
ORDER BY 
    date_created   
LIMIT 10 

Editted:それはアスカーの唯一の一時ソリューションですとしてAND cp.picture_no = 0を削除します。提案にはPaul Spiegelありがとうございます。

+0

'AND cp.picture_no = 0'は回避策でした。削除する必要があります。 –

+0

@PaulSpiegel arrありがとう、私の悪いコピー貼り付け! –

+0

これはうまくいくようです。私は "#1060 - 重複した列名 'classified_id'"を取得します。また、このソリューションが十分に高速であるかどうかも疑問です。このスクリプトは、aproxの50Kユーザーからのすべてのユーザーのループ内でcron_jobとして実行されます。 – merlin

0

あなたはこのようなものに参加する変更することができます:

LEFT JOIN (select * from $T6 AS cp where ca.ID = cp.classified_id order by picture_no asc limit 1) on ca.ID = cp.classified_id 
+1

"FROM句のサブクエリは、JOIN操作のON句内で使用されていない限り、サブクエリには関連付けられません。 [FROM句のサブクエリ](https://dev.mysql.com/doc/refman/5.7/en/from-clause-subqueries.html) –

+0

@ PhamX.Bach - ON句で正しく使用された場合、MySQLはそれぞれの 'ca.ID'に対して結果をキャッシュする必要があります。 –

0

最高の変種ではありませんが、あなたは置き換えることができますと

LEFT JOIN $T6 AS cp ON ca.ID = cp.classified_id AND cp.picture_no = 0 

を:

LEFT JOIN $T6 AS cp ON ca.ID = cp.classified_id 
LEFT JOIN $T6 AS cp_temp 
ON cp_temp.ID = cp.classified_id 
AND cp_temp.picture_no < cp.picture_no 

とクエリの最後にwhere句にAND cp_temp.id IS NULLを追加します。

ので、最終的なクエリのようなものが考えられます(まだ行っていない場合は1、適切なCREATEおよびINSERT文を提供します。あなたが好きなら、

SELECT 
    ca.*, 
    ca.ID AS ad_id, 
    ca.cat_id, 
    UNIX_TIMESTAMP(ca.date_edited) AS date, 
    cp.*, 
    ar.area_name 
FROM $DB.$T4 ca 
LEFT JOIN $T6 AS cp 
ON ca.ID = cp.classified_id 
LEFT JOIN $T6 AS cp_temp 
ON cp_temp.ID = cp.classified_id 
    AND cp_temp.picture_no < cp.picture_no 
LEFT JOIN $T60 zip 
ON ca.zip_id = zip.zip_id 
LEFT JOIN $T3 ar 
ON zip.area_id = ar.ID 
WHERE ca.extern = 0 
    AND ca.confirmed = 1 
    AND ca.advertiser_id = ".$user['uid']." 
    AND cp_temp.id IS NULL 
ORDER BY date_created   
LIMIT 10 
関連する問題