MySQL创建高级查询

时间:2012-01-09 15:43:28

标签: mysql sql database union

摘要

所以我有3张桌子,下面有截图。默认情况下,每个用户在注册时都会获得10张幻灯片,因此信息位于"幻灯片中。表。 template_id只是我拥有的另一个表与custom_slides表相同,除了有10个预制幻灯片是默认幻灯片,所以如果我想更新默认幻灯片的页面名称,我只是做它曾经在那个模板表中。

如果幻灯片是自定义幻灯片,则template_id将为NULL,就像您在幻灯片11中看到的那样,幻灯片11将被放入custom_slides表中。


我需要什么

所以我需要帮助编写查询来获取一些信息。我想抓取某个用户的slide_id,sort_order和page_name。

到目前为止,我有以下内容:

SELECT slide_id, sort_order FROM `user_slides` WHERE user_id = 1

现在我需要抓取page_name但我需要运行一个单独的查询。

  • 检查幻灯片表上的slide_id,看看template_id是否为NULL或是否为值。
  • 如果它有一个值,那么它是一个默认幻灯片,所以如果template_id为3,那么我需要运行一个查询来从模板表中获取page_name,其中template_id = 3
  • 如果template_id为NULL,那么我需要运行一个查询来查找custom_slides表中的page_name,其中slide_id =任何幻灯片ID。

我在运行多个查询和UNION以及所有这些方面都没有太多经验,所以如果有人可以帮我开始创建这个查询,我会非常感激。


表预览

user_slides

enter image description here

幻灯片

enter image description here

custom_slides

enter image description here

2 个答案:

答案 0 :(得分:2)

我相信这个查询应该获取你想要的数据:

SELECT slide_id, sort_order, COALESCE(`templates`.page_name, `custom_slides`.page_name)  
FROM `user_slides` 
JOIN `slides` ON `slides`.slide_id = `user_slides` .slide_id
LEFT OUTER JOIN `templates` ON `templates`.template_id = `slides`.template_id
LEFT OUTER JOIN `custom_slides` ON `slides`.template_id IS NULL AND `custom_slides`.slide_id = `slides`.slide_id
WHERE `user_slides`.user_id = 1

<强>澄清: 这基本上是您使用一些联接发布的选择查询。 首先,slides表与slide_id匹配。 然后连接templates表,外连接确保仍包含template_id为NULL的行。最后custom_slides表已连接,但仅当template_id为NULL时才会加入。然后使用COALESCE我们从custom_slidestemplates中选择页面名称。

答案 1 :(得分:1)

你可以在模板表上尝试两个左连接(你没有给出一个名字,所以我只是在我的例子中称它为“模板”)和custom_slides表。

SELECT * 
FROM user_slides us
INNER JOIN slides s 
  ON us.slide_id = s.slide_id
LEFT JOIN templates t
  ON s.template_id=t.template_id
LEFT JOIN custom_slides cs
  ON s.slide_id = cs.slide_id
WHERE user_id = 1

这应该返回user_slidesslides中的所有行,即使templates中没有相应的行(例如template_id中的slides在NULL)或custom_slides中(即slide_id不是自定义幻灯片,因此custom_slides表中不存在)。

但是,您应该在应用程序层中仍然有一些逻辑(假设有一个应用程序运行查询并使用结果)来检查template_id是否为NULL,如果是,则使用custom_slides。