【问题标题】:Complex MySQL query from 4 tables来自 4 个表的复杂 MySQL 查询
【发布时间】:2014-03-17 08:23:49
【问题描述】:

到目前为止,我在组合 4 个表格方面的搜索还没有成功。我有 4 张桌子:

内容

content_id | source_id | content_title   | content_date
--------------------------------------------------------
1          | 1         | The factory     | 189982398300
2          | 2         | Cold and cloudy | 189982398299
3          | 2         | Green tea       | 189982398298

来源

source_id | source_name
-------------------
1         | BBC
2         | Reuters

设置

setting_id | setting_name
-------------------------------
1          | bbc_iplayer_string
2          | reuters_video_id
3          | reuters_category

content_join_settings

content_id | setting_id | setting_data
------------------------------------------
1          | 1          | Js88sdhjsd0gDS09
2          | 2          | video_8AJK3ADJD8
2          | 3          | weather
3          | 2          | video_K7KD8N2ND9
3          | 3          | food and drinks

因此,您可能已经注意到,每条内容记录都有自己的源链接,并根据源提供额外的设置。 BBC 的帖子有 bbc_iplayer_string,路透社的帖子有 reuters_video_idreuters_category。当然这只是一个例子。

我希望将结果合并,并使用 setting_name 作为列名。我不知道如何解释,所以我会展示它:

content_id | source_name | content_title   | content_date | bbc_iplayer_string | reuters_video_id | reuters_category
--------------------------------------------------------------------------------------------------------
1          | BBC         | The factory     | 189982398300 | Js88sdhjsd0gDS09   | NULL             | NULL
2          | Reuters     | Cold and cloudy | 189982398299 | NULL               | video_8AJK3ADJD8 | weather
3          | Reuters     | Green tea       | 189982398298 | NULL               | video_K7KD8N2ND9 | food and drinks

我对复杂的 MySQL 查询不是很熟练。我不知道从哪里开始寻找,更不用说搜索什么了。我从这个查询开始,但我不知道如何继续。我可能还没有接近。

SELECT 
  * 
FROM
  content,
  sources,
  settings,
  content_join_settings
WHERE
  content.content_id = content_join_settings.content_id AND
  settings.setting_id = content_join_settings.setting_id AND
  sources.source_id = content.source_id
GROUP BY
  content.content_id
ORDER BY
  content.content_date
  DESC

【问题讨论】:

  • 你尝试过内部连接了吗?
  • 为什么要分组?大多数数据库会在 group by 子句上为此抛出错误……MySQL 不会返回错误,而是会做错事。 Group by 用于聚合,通常不适用于 select *。您还在使用旧的连接语法...您反对使用内部连接 ​​tablea a on...语法吗?
  • @raiyan - 他正在做一个内部连接,只是旧语法。
  • 你只有三个设置吗?或者还有更多?
  • @bob 您正在寻找“透视”数据...尝试搜索一个透视答案(如果您仍然需要,我可以在今晚找到它)。 Group by 将清理 MySQL 的结果,但实际上只是将信息错误地组合在一起。

标签: mysql sql


【解决方案1】:

您需要连接表,然后旋转结果以将行移动到列中。

SELECT c.content_id, s.source_name, c.content_title, c.content_date,
       MAX(CASE setting_name WHEN 'bbc_iplayer_string' THEN setting_data END) AS bbc_iplayer_string,
       MAX(CASE setting_name WHEN 'reuters_video_id' THEN setting_data END) AS reuters_video_id,
       MAX(CASE setting_name WHEN 'reuters_category' THEN setting_data END) AS reuters_category
FROM content AS c
INNER JOIN sources AS s ON s.source_id = c.source_id
INNER JOIN content_join_settings AS cjs ON cjs.content_id = c.content_id
INNER JOIN settings as st ON st.setting_id = cjs.setting_id
GROUP BY c.content_id

DEMO

【讨论】:

  • 你已经帮了我这么多,我几乎不敢问,但我有一个后续问题:是否可以动态获取setting_names?我使用了很多不同的来源,它们都有自己的设置,从长远来看,这将是一个很长的查询。
  • 您需要为此编写动态 SQL。我会看看我是否能找到一个显示它的答案。
【解决方案2】:

这会有帮助吗?

SELECT 
  * 
FROM
  content as ct inner join sources as ss on ct.source_id = ss.source_id
  inner join content_join_settings as cst on ct.setting_id = cst.setting_id
  inner join settings as st on st.setting_id = cst.setting_id
GROUP BY
  content.content_id
ORDER BY
  content.content_date
  DESC

【讨论】:

  • 恭喜,您已经成功地将他的语法从旧改成新的,但还没有解决问题
  • 哇,自从我提交后页面加载之前就出现了 -1。愿意解释一下原因吗?
  • 解释在上面...他的语法没有问题,where 子句中的连接是一种较旧的查看方式,但仍然有效。他的问题是“我希望将结果合并,并将 setting_name 作为列名”,请解释一下您是如何回答的。
  • 好的,知道了。首先,我认为他需要一个名为“setting_name”的上校。我花了一段时间才意识到这个问题与我想的完全不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2021-03-14
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2012-02-08
相关资源
最近更新 更多