J'ai ces deux tableaux - user_schedules et user_schedule_meta, illustrés ci-dessous:

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

Et

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

Je souhaite écrire une requête pour me permettre de sélectionner, par exemple, dans les deux tables où TOUTES les 5 conditions ci-dessous sont remplies:

  1. user_schedule_id = 3
  2. scheduler_id = 6
  3. session_id = 15
  4. cours-id = 135
  5. schedule-id = 120

C'est ce que j'ai jusqu'à présent, mais cela ne fonctionne pas:

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`

Des suggestions sur ce que je ne fais pas correctement?

0
NaijaProgrammer 17 janv. 2017 à 14:54

2 réponses

Meilleure réponse

Il s'agit d'un problème de recherche de magasin clé-valeur typique. Celles-ci sont plus délicates qu'elles ne le paraissent en SQL, en ce qu'elles nécessitent plusieurs opérations JOIN.

Vous avez besoin d'une table virtuelle avec une ligne par valeur user_schedules.id, puis vous pouvez la filtrer. Alors

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

Notez également que vous pouvez lister votre table avec des attributs associés comme celui-ci. Cette astuce consistant à joindre plusieurs fois la table clé / valeur est une sorte d'opération pivot . J'utilise LEFT JOIN car cela permettra au jeu de résultats d'afficher les lignes où un attribut est manquant.

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'
2
O. Jones 17 janv. 2017 à 12:11

Essayez c'est du code

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
)
0
Mehul Akabari 17 janv. 2017 à 12:36