2017-08-19 5 views
0

私はもはやそれを取得しません。クラブのサイトについては、クラブのすべてのピンボールマシンの概要を示したいと思います。 1 2つのテーブルmysql lleft joinは右のテーブルから最新のレコードを1つ使用できますか?

テーブルの1-キャビネット

cabid | owner | cabname |valid | description 
-------------------------------------------------- 
1 | 3 | adams family | 1 | Lorem ipsum dolor sit amet 
2 | 3 | Twilight zone | 1 | Lorem ipsum dolor sit amet 
3 | 4 | AC/DC | 0 | Lorem ipsum dolor sit amet 
4 | 5 | Lord of the Rings | 1 | Lorem ipsum dolor sit amet 

表2 - 写真

photoid | cabid | ismain | photourl 
------------------------------------------------------------------- 
1 | 4 | 1 | fofofmasomfsaomfosa.jpg 
2 | 4 | 0 | vdsnvnds89vds8vhsds.jpg 
3 | 2 | 0 | v89ahv9sdvhs,jpg 
4 | 2 | 0 | fsdfhsdfhsdavs.jpg 
5 | 1 | 0 | sdv8ihsda98vhdsvs.jpg 

etc 
etc 

持って、私は1つのクエリで有効な表1からすべてのキャビネットからの概要を説明したいん(有効= 1)。そして写真があれば、これを見せてください。ユーザがメイン画像として写真をマークした場合は、この1つは、示さなければ(ismainを)持っている(必ずしもすべてのキャビネットは写真を持っている)ismain DESCによって順と気にいらないようなそうでない場合は、最新の、PHOTOID ASC

私は今この

select c.*,p.* 
from cabinets c 
    LEFT JOIN photos p USING (cabid) 
where c.valid = '1' 
GROUP by c.cabid 
order by c.cabid DESC, p.ismain DESC, p.photoid ASC 
LIMIT 5 

しかし、それは間違った写真を示し、

は私が1つの速くクエリを可能にしたいものですか?

答えて

0

あなたは、パフォーマンスのために

select distinct c.*, p.* 
from cabinets c 
LEFT JOIN photos on c.cabid = p.cabid 
where c.valid = '1' 
order by c.cabid DESC, p.ismain DESC, p.photoid ASC 
LIMIT 5 

を(あなたが避けるために重複する値を明確な使用することができます最終的には、グループを必要としないので、あなたは、集計関数を使用していない)に参加シンプルな左を使用することができます。..最も重要なの事は

+0

クエリが遅くなって以来、「SELECT *」を避けるべきだと聞いていましたか? – Noob

+0

OPがすべての列を必要とする場合。select *またはselect .. col1、col2を使用します。パフォーマンスなども同じです。OPはいくつかの列しか必要とせず、これらの列が関連するインデックス – scaisEdge

+0

に格納されている場合のみ違います。この場合、彼はデータベースのすべての値を必要としないので、特定の列を選択できる – Noob

0

ファスト写真上のキャビネットでcabidのための指標の存在とcabidため

チェックは、データボリューム上のビットとあなたがインデックスを持っている場合に大きく依存結合列上の正しいインデックスに存在することです場所。一般的には可能です。一つの方法は次のとおりです。

select DISTINCT c.*,p.* 
from cabinets c 
LEFT JOIN photos p ON c.cabid=p.cabid 
where c.valid = '1' 
order by c.cabid DESC, p.ismain DESC, p.photoid ASC 
LIMIT 5 

差がGROUP BYの除去です。 GROUP BYを非ANSIモードで使用していましたが、これは予期しない動作です。また、私はあなたの質問にGROUP BYのための使用を見ることができませんでした。

このクエリの欠点は、cabid=1の最初のすべての写真を返すことです。したがって、cabid=1の写真が5つ以上ある場合、2,3などには決して行きません。 cabidの5枚の写真を取得するには、WHERE cabid=?を追加して、すべてcabidを照会する必要があります。

0

キャビッドに複数の値がある場合、以前の回答ではどちらも写真が1つだけの場合は、 という要件は考慮されていないようです。正しい写真がある場合は、これが返されます。

SELECT a.* 
    b.* 
FROM cabinets a 
LEFT JOIN (
    SELECT * 
    FROM photos 
    WHERE a.cabid = b.cabid 
    ORDER BY b.ismain DESC 
    LIMIT 1) b 
ON a.cabid = b.cabid 
WHERE a.valid = 1 
ORDER BY a.cabid 
+0

ありがとう、しかし、これは私には:未知の列 'a.cabid' 'where句'と私は "どこで 'a.cabid' = 'b.cabid'を使用する場合は"全て:( –

+0

テーブルの写真に '' 'cabid'''という名前の列がありますか?それは異なっていますか? –

関連する問題