2017-06-27 31 views
0

に参加MySQLのクエリは、私は2つのテーブルを持っている同じテーブル

ID | title 
0 | Adam 
1 | Ben 
2 | Sara 
3 | Camille 

users_meta:

ID | user_ID | meta_key | meta_value 
0 |  0 | 'weight' | '80' 
1 |  0 | 'sex'  | 'male' 
2 |  1 | 'weight' | '93' 
3 |  1 | 'sex'  | 'male' 
4 |  2 | 'weight' | '57' 
5 |  2 | 'sex'  | 'female' 
6 |  3 | 'weight' | '71' 
7 |  4 | 'sex'  | 'female' 

は、今私は男性とより多くの重量であるすべてのユーザーを取得したいです90よりも、私のクエリ:

SELECT u.* FROM users AS u 
RIGHT JOIN users_meta AS weight on(u.ID=weight.user_ID) 
RIGHT JOIN users_meta AS sex on(u.ID=sex.user_ID) 
WHERE 
    weight.meta_key='weight' AND 
    weight.meta_key>90 AND 
    sex.meta_key='sex' AND 
    sex.meta_value ='male' 

上記のクエリはうまく動作しますが、これを行うより良い方法があれば私は興味があります。ユーザーごとに多数のメタデータがある場合、異なる値をチェックするために同じテーブルにいくつかの結合が行われます。

+0

usersテーブルに体重と性別の列がないのはなぜですか?キー/バリューテーブルでは何を得るのですか?私の意見では、これは物事を必要以上に複雑にし、タイプミスやエラーの余地を与えます。しかし、まあ、あなたは、哺乳類であるかどうか、または彼らが緑色の皮膚を持っているかどうかに興味があるところで、地球外のユーザーを格納することができます。 :-) –

+0

表構造「これを行うのは良い方法があります場合、私は好奇心」だからも、1日の現在、私はドン、WordPressのpostmetaテーブルから来て、あなたのテーブルのデザインは* * ;-)優れあまりにも多くのことを証明します各メタキーに対して新しい列を持つオプションがあります。 – ArturoO

+0

WordPressには一般的なテーブルが必要です。クエリーが遅すぎたり複雑すぎたりする場合は、 'xusers(id、name、weight、sex)'などのシャドウテーブルを作成し、トリガーでそれらを埋めることができます。しかし、私はこれが本当に必要かどうか二度考えます。 –

答えて

2

テーブルを簡単に集計できます。適切なHAVING句を適用して、条件を満たすユーザーIDのみを保持してください。次に、この一連のユーザーIDを選択します。

select * 
from users 
where user_id in 
(
    select user_id 
    from users_meta 
    where meta_key in ('weight', 'sex') -- not necessary, but probably faster 
    group by user_id 
    having sum(meta_key = 'weight' and meta_value > 90) > 0 
    and sum(meta_key = 'sex' and meta_value = 'male') > 0 
); 
+0

あなたのお問い合わせは、追加のJOIN /メタキーを必要としません、私はそれをテストし、適切な結果を受け取ります。ありがとう! – ArturoO

1

あなたは、単一のjoinで行うことができます、例えば:

SELECT DISTINCT u.id, u.title 
FROM users u JOIN users_meta m ON u.id = m.user_id 
WHERE (u.meta_key = 'weight' AND u.meta_value > 90) 
OR (u.meta_key = 'sex' AND u.meta_value > 'male'); 

更新

あなたは、あなたが2つのjoinクエリを行うことができます90以上の重みを持つすべての男性を取得したい場合は、例えば:

SELECT * 
FROM (
    SELECT id, title FROM user WHERE id in (SELECT user_ID FROM user_meta WHERE meta_key = 'weight' AND meta_value > 90) 
) a JOIN (
    SELECT id, title FROM user WHERE id in (SELECT user_ID FROM user_meta WHERE meta_key = 'sex' AND meta_value > 'male') 
) b ON a.id = b.id; 
+0

@downvoter reason? –

+0

正しく働いているようですね、ありがとう。 – ArturoO

+0

男性の体重が90を超えているすべてのユーザーが返されますか?質問はOR条件ではなくAND条件を求めました。何か不足していますか? –

関連する問題