【问题标题】:MySQL: Select several rows based on several keys from two different tablesMySQL:根据来自两个不同表的多个键选择几行
【发布时间】:2017-01-17 20:36:43
【问题描述】:

我有这两张表——user_schedulesuser_schedule_meta,如下图:

------------------------------------
| 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_schedule_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`

有什么建议我做的不对吗?

【问题讨论】:

  • 这两张表之间有没有关系。
  • @Suchit,user_schedule_meta 表包含有关user_schedules table 中每个条目的附加信息
  • 如果您加入 user_schedules.id = user_schedule_meta.user_schedule_id 并且您的条件是 user_schedule_id = 3 and scheduler_id = 6 。你不会得到任何记录,因为它们是不同表中的同一列,你需要在这里使用or
  • 请勿使用user_schedule_meta, user_schedules,这是一种旧式写作。使用 join 代替。

标签: php mysql sql key-value


【解决方案1】:

这是一个典型的键值存储查找问题。这些比在 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

还请注意,您可以像这样列出带有相关属性的表格。这种多次加入键/值表的技巧是一种 pivot 操作。我使用 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'

【讨论】:

    【解决方案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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多