php - MySQL:根据两个不同表中的多个键选择几行

标签 php mysql sql key-value

我有这两个表 - 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. 类(class) 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`

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

最佳答案

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

关于php - MySQL:根据两个不同表中的多个键选择几行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41696451/

相关文章:

mysql - 我如何使用连接获取成员计数

php - 如何在php中的if else条件中使用mysql之类的运算符

php - PHP 中 str_replace 的性能

javascript - ekko-lightbox 和从 PHP 脚本返回为 BLOB 的图像

php - 按顺序对输出进行编号

PHP/SQL - 从两个表、两个数据库中选择数据并按时间排序

PHP:mySQL:无法更新数据库中的所有行。表正在部分更新

sql - 使用 VBA 将 Excel 表连接到 SQL Server

sql - 在 sqlite SQL 语句中结合 order by 子句使用限制

php - 使用 PHP 和 MySQL 无法搜索字符串中存在特殊字符