2012-02-10 16 views
1

私は次のサンプルクエリ(MySQLの)持っている:SQL - 結合を使用する必要がありますか?

SELECT * FROM `action` 
WHERE `customer_id` IN 
    (SELECT `id` FROM `customer` WHERE `status`=1) 
ORDER BY 
    action.date ASC 
LIMIT 0, 10 

を私はcustomer.statusフィールドで注文することができるようにする必要があります。私は結合でこれを達成しますか?

statusは、customerのフィールドです。


編集クエリ:

SELECT * FROM `action` 
ORDER BY 
    action.date ASC 
LIMIT 0, 10 

重要!

私はPHP経由で返信データを解析しています。改訂されたクエリの実行後:

SELECT * FROM `action` a INNER JOIN `customer` c ON a.customer_id = c.id ORDER BY a.form_id ASC LIMIT 0, 10 

私のPHPコードブレークを...


This postは私を助けました。

SELECT 
    *, a.id AS lead_id, c.id AS customer_id 
FROM 
    `action` a 
INNER JOIN 
    `customer` c ON a.customer_id = c.id 
ORDER BY c.status DESC 

みんなありがとう:

私の改訂クエリは次のようになります!


UPDATE

私は行動記録、INNERせずに一部の顧客レコードを持っているため、関連するすべてのレコードを返していなかったのJOIN。私は今すぐJOINを使用し、すべての結果が期待通りに戻ってきます。

+0

これはステータスによるフィルタですので、例 – AVProgrammer

答えて

5
SELECT * 
FROM `action` a 
INNER JOIN `customer` c on a.`customer_id` = c.`id` 
WHERE c.`status` in (1, 4, 7, 8) 
ORDER BY a.date, c.status 
LIMIT 0, 10 
+0

を編集する必要があります。これはAVPに行く方法ですが、あなたの質問の音からCで注文したいと思います。ステータスは最初に –

+2

私はMySQLのエキスパートではありませんが、ORDER BY句に 'c.status'の理由があるのが不思議です。 –

+0

アクションテーブルの結果だけが必要な場合は、。*を選択してGROUP BY a.idをクエリの末尾に追加することができます –

2

はい、あなたが参加し、速いかもしれでそれを達成することがあります。

SELECT * FROM `action` a join customer c on c.id=a.customer_id 
where c.status=1 
ORDER BY 
    a.date ASC 
LIMIT 0, 10 

また、*を使用して、代わりにあなたが必要な列をリストしていないことを検討してください。すべての列よりも少ない列を選択する必要がある場合に備えてパフォーマンスが向上し、将来表が変更されても驚きは発生しません。

あなたが行うことができます
+0

お客様の注文により追加注文を忘れた –

+0

@Paulありがとうございました! – Icarus

+0

を@MikeChristensenのポイントにすると、ステータスが常にwhereの句で1になることが保証されているため、不要なソートが不要になります。 –

2

次のいずれか

SELECT * FROM `action` a 
INNER JOIN `customer` c on c.id = a.customer_id 
WHERE c.status = 1 
ORDER BY a.date ASC, c.status 
LIMIT 0, 10 

または:

SELECT * FROM `action` a 
INNER JOIN `customer` c on (c.id = a.customer_id and c.status = 1) 
ORDER BY a.date ASC, c.status 
LIMIT 0, 10 

EDIT:

それは常に意志としてそれは、おそらく何の意味がc.statusで注文するにはありません指摘価値があります1となります。しかし、私はそれをOPに言及されているだけでなく他の人たちによっても育ったので、そこに入れました。私はそれが両方のクエリから削除できると思います。

+0

お客様のステータス別の注文を忘れた –

+0

@Paul - ステータスではありませんそのクエリで常に1? –

1
SELECT * FROM `action` a 
JOIN `customer` c on a.customer_id=c.id 
WHERE c.status=1 order by a.date, c.status ASC 
LIMIT 0, 10