【问题标题】:MySQL query from multiple tables, main table and meta tableMySQL 从多个表、主表和元表查询
【发布时间】:2020-04-18 21:51:11
【问题描述】:

如果我有 2 个类似的表,你会如何建议构建查询

表格'帖子'

  ID   |   post_cat   |   post_type   |   post_date
  1    |   1          |   0           |   xyz        
  2    |   3          |   1           |   xyz   

'post_meta'

p_id   |   meta_key   |   meta_value
1      |   name       |   John
1      |   location   |   NY
1      |   age        |   31
2      |   name       |   Jane
2      |   age        |   26

要求:
1. 我想得到如下结果:

 ID |  post_cat |  post_type |  post_date |  name |     location  |  age 
 1  |    1      |    0       |      xyz   |  john |      NY       |  31
 2  |    3      |    1       |       xyz  |  Jane |               |  26  
  1. 当我尝试根据 post_meta > meta_key 获取结果时,您建议如何进行查询;例如搜索帖子,其中 post_meta.meta_key=location 和 meta_value=NY?

【问题讨论】:

  • 请告诉我们你的尝试。

标签: mysql sql


【解决方案1】:

我会说在表之间使用 JOIN。如果您希望每个结果行有多个 meta_key,请多次加入 post_meta 表,例如

SELECT * FROM posts p
JOIN post_meta m ON p.id = m.p_id
WHERE m.meta_key = 'location' AND m.meta_value = 'NY'

SELECT * FROM posts p
JOIN post_meta mn ON p.id = mn.p_id AND mn.meta_key = 'name'
JOIN post_meta ma ON p.id = ma.p_id AND ma.meta_key = 'age'

您可以列出您真正想要的列而不是所有列 (*)。如果特定的 meta_key 可能是可选的,您可能还想使用 LEFT JOIN

【讨论】:

  • 不要在没有解释的情况下发布答案。 OP 没有从答案中学到任何东西。
  • @Ama 添加了一个介绍性句子。
【解决方案2】:

首先,您希望通过条件聚合来进行旋转:

SELECT ID, post_cat, post_type, post_date, 
       max(case when m.meta_key = 'name' then m.meta_value end) as name,
       max(case when m.meta_key = 'location' then m.meta_value end) as location,
       max(case when m.meta_key = 'age' then m.meta_value end) as age
  FROM posts p
  JOIN post_meta m
    ON m.p_id = p.ID
 GROUP BY ID, post_cat, post_type, post_date   

Demo

我不明白第二个是什么意思。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多