2017-01-17 2 views
0

나는이 두 테이블이에서 여러 키를 기준으로 여러 행을 선택 - user_schedulesuser_schedule_meta을, 아래 :MySQL은 두 개의 서로 다른 테이블

------------------------------------ 
| 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.id = user_schedule_meta.user_schedule_id'에 합류하고 사용자의 상태가'user_schedule_id = 3 and scheduler_id = 6' 인 경우'user_schedules 테이블' – NaijaProgrammer

+0

의 각 항목에 대한 추가 정보를 담고 있습니다 . 그들은 당신이'또는'여기서 사용해야하는 다른 테이블의 같은 열이기 때문에 어떤 레코드도 얻지 못할 것입니다. –

답변

2

이것은 일반적인 키 - 값 저장소 조회 문제입니다. 이들은 SQL에서 보는 것보다 더 까다 롭습니다. JOIN 작업이 여러 번 필요합니다.

user_schedules.id 값당 하나의 행이있는 가상 테이블이 필요하면 필터링 할 수 있습니다. 따라서

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

는이 두 테이블 사이의 관계가이 코드

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 
) 
관련 문제