2

私は2つのテーブルservicesmember_servicesを持っています

サービス

ここに画像の説明を入力

member_type_id = 1のmember_servicesからレコードをフェッチするには、私が書いた

SELECT s.* FROM member_services ms 
LEFT JOIN services s 
ON s.ser_id = ms.ser_id 
WHERE ms.mem_id = 1 && ms.pro_id = 9 && ms.member_type_id = 1

しかし、それは戻ります

ここに画像の説明を入力

member_type_id 2のレコードを返すのはなぜですか?

私がクエリでやっている間違いは何ですか?

4

3 に答える 3

0

これを試して:

SELECT s.* FROM member_services ms LEFT JOIN services s 
ON ms.ser_id = s.ser_id AND ms.member_type_id = s.member_type_id
WHERE ms.mem_id = 1 AND ms.pro_id = 9 AND ms.member_type_id = 1
于 2012-06-28T18:00:10.460 に答える
0

クエリは問題ありません。member_type_id = 2を返す理由は、member_type_idというサービスに行があり、これがmember_servicesのmember_type_idに対応していないためです。

ここでの本当の問題は、2つのテーブル間のデータの競合です。それらが同じデータであると想定される場合は、外部キーを使用して2つをリンクするのがおそらく最善です。

于 2012-06-28T18:04:17.650 に答える
0

代わりに次のクエリを試してください。

SELECT s.* FROM member_services ms 
LEFT JOIN services s 
USING(ser_id,member_type_id) 
WHERE ms.mem_id = 1 && ms.pro_id = 9 && s.member_type_id = 1

フィールドが同じように呼び出されるため、 USING()の ON を変更しました。これは一種のショートカットです。

もう 1 つの違いは、結合に 2 つのフィールドを使用することです ( のようにON s.ser_id = ms.ser_id AND s.member_type_id = ms.member_type_id)。そうすれば、フィルターが正しく適用されます。

最後の変更はWHERE句にあり、member_type_id = 1テーブルで行うのではなく、サービス テーブルでフィルタリングしmember_servicesます。ms エイリアスを単に s に変更することを意味します)。

お役に立てば幸いです。さらにサポートが必要な場合はお知らせください。

于 2012-06-28T18:11:13.460 に答える