2017-01-17 14 views
0

からいくつかのキーに基づいて複数の行を選択 - user_schedulesuser_schedule_meta、以下に示す:私は、クエリを書きたいMySQLの:私はこの2つのテーブル持っている2つの異なるテーブル

------------------------------------ 
| id | scheduler_id | status | 
------------------------------------ 
    1  3   pending 
    2  5   active 
    3  6   active 

---------------------------------------------- 
| id | user_schedule_id | meta_key |meta_value 
---------------------------------------------- 
1   3    course-id 135 
2   3    session-id 15 
3   3    schedule-id 120 

をたとえば、以下の5つの条件のすべてが満たされている両方のテーブルから選択することができます:

  1. user_s chedule_id = 3
  2. scheduler_id = 6
  3. SESSION_ID = 15
  4. コース-ID = 135
  5. スケジュール-ID = 120

これは私がこれまで持っているものであるが、それは動作していません:

SELECT user_schedule_meta.`id` FROM user_schedule_meta, user_schedules 
WHERE user_schedules.`scheduler_id` = 6 
AND user_schedules.id = user_schedule_meta.`user_schedule_id` 
AND ( 
(user_schedule_meta.`meta_key` = 'course-id' AND user_schedule_meta.`meta_value` = 135) 
OR (user_schedule_meta.`meta_key` = 'session-id' AND user_schedule_meta.`meta_value` = 15) 
OR (user_schedule_meta.`meta_key` = 'daily-schedule-id' AND user_schedule_meta.`meta_value` = 120) 
) 
GROUP BY user_schedule_meta.`id` 

私が正しくやっていないことは何ですか?

+0

でみてください。 –

+0

@Suchit、 'user_schedule_meta'テーブルは' user_schedulesテーブル ' – NaijaProgrammer

+0

の各エントリに関する追加情報を保持しています。 。彼らはあなたが 'または'ここで使用する必要がある別のテーブルの同じ列であるため、レコードを取得しません。 –

答えて

2

これは、一般的なキー値ストアのルックアップの問題です。これらは、複数のJOIN操作が必要であるという点で、SQLよりも扱いにくいです。

user_schedules.idの値ごとに1行の仮想テーブルが必要な場合は、それをフィルタリングできます。したがって

SELECT u.id, u.scheduler_id 
    FROM user_schedules u 
    JOIN user_schedule_meta a ON u.id=a.user_schedule_id AND a.meta_key='course-id' 
    JOIN user_schedule_meta b ON u.id=b.user_schedule_id AND b.meta_key='session-id' 
    JOIN user_schedule_meta c ON u.id=c.user_schedule_id AND c.meta_key='daily-schedule-id' 

WHERE a.meta_value = 135 -- value associated with course-id 
    AND b.meta_value=15  -- value associated with session-id 
    AND c.meta_value=120 -- value associated with daily-schedule-id 

このような関連する属性でテーブルを一覧表示することもできます。キー/値テーブルを複数回結合するこのトリックは、ピボット操作の種類です。私はLEFT JOINを使用します。なぜなら、結果セットで属性が見つからない行を表示できるからです。

SELECT u.id, u.scheduler_id, u.status, 
     a.meta_value AS course_id, 
     b.meta_value AS session_id, 
     c.meta_value AS daily_schedule_id 
    FROM user_schedules u 
    LEFT JOIN user_schedule_meta a ON u.id=a.user_schedule_id AND a.meta_key='course-id' 
    LEFT JOIN user_schedule_meta b ON u.id=b.user_schedule_id AND b.meta_key='session-id' 
    LEFT JOIN user_schedule_meta c ON u.id=c.user_schedule_id AND c.meta_key='daily-schedule-id' 
+0

ありがとうございます。これはそれでした。 – NaijaProgrammer

0

は、これらの2つのテーブル間のいずれかの関係があります、これはコード

select * from user_schedule_meta where user_schedule_id=3 and 
(meta_key='session-id' AND meta_value=15 
or meta_key='daily-schedule-id' AND meta_value=120 
or meta_key='course-id' AND meta_value=135 
) 
関連する問題