所以我有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但我需要运行一个单独的查询。
我在运行多个查询和UNION以及所有这些方面都没有太多经验,所以如果有人可以帮我开始创建这个查询,我会非常感激。
user_slides
幻灯片
custom_slides
答案 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_slides
或templates
中选择页面名称。
答案 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_slides
和slides
中的所有行,即使templates
中没有相应的行(例如template_id
中的slides
在NULL)或custom_slides中(即slide_id
不是自定义幻灯片,因此custom_slides
表中不存在)。
但是,您应该在应用程序层中仍然有一些逻辑(假设有一个应用程序运行查询并使用结果)来检查template_id是否为NULL,如果是,则使用custom_slides。