MySQL创建高级查询 总结
所以我有3张表,下面有截图。默认情况下,每个用户在注册时都会获得10张幻灯片,因此信息位于“幻灯片”表中。模板id只是我拥有的另一个表,它与MySQL创建高级查询 总结,mysql,sql,database,union,Mysql,Sql,Database,Union,所以我有3张表,下面有截图。默认情况下,每个用户在注册时都会获得10张幻灯片,因此信息位于“幻灯片”表中。模板id只是我拥有的另一个表,它与自定义幻灯片表相同,只是有10个预先制作的幻灯片是默认幻灯片,因此如果我想更新默认幻灯片的页面名称,我只需在该模板表中执行一次 如果幻灯片是自定义幻灯片,那么模板id将为空,就像您看到的幻灯片11一样,幻灯片11将被放入自定义幻灯片表中 SELECT * FROM user_slides us INNER JOIN slides s ON us.sl
自定义幻灯片
表相同,只是有10个预先制作的幻灯片是默认幻灯片,因此如果我想更新默认幻灯片的页面名称,我只需在该模板表中执行一次
如果幻灯片是自定义幻灯片,那么模板id将为空,就像您看到的幻灯片11一样,幻灯片11将被放入自定义幻灯片表中
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
我需要什么 因此,我需要帮助编写查询以获取一些信息。我想获取某个用户的幻灯片id、排序顺序和页面名称 到目前为止,我有以下几点:
SELECT slide_id, sort_order FROM `user_slides` WHERE user_id = 1
现在我需要获取页面名称,但我需要运行一个单独的查询
- 检查幻灯片表上的幻灯片id,查看模板id是否为空或是否有值
- 如果它有一个值,那么它是一个默认幻灯片,因此如果模板id为3,那么我需要运行一个查询,从templates表(其中模板id=3)中获取页面名称
- 如果template_id为NULL,那么我需要在custom_slides表中运行查询以查找页面名称,其中slide_id=任何幻灯片id
表格预览 用户\u幻灯片 幻灯片 自定义幻灯片
您可以在templates表(您没有给出名称,所以我在示例中称之为“templates”)和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
即使模板中没有相应的行(即幻灯片中的模板id
为空)或自定义幻灯片中,也应返回用户幻灯片
和幻灯片
中的所有行(即,如果幻灯片id
不是自定义幻灯片,因此在自定义幻灯片
表中不存在)
但是,您应该在应用程序层(假设有一个应用程序运行查询并使用结果)中有一些逻辑来检查模板id是否为空,如果为空,则使用自定义幻灯片。您可以尝试在templates表上使用两个左联接(您没有给出名称,所以我在示例中称之为“templates”)在定制的幻灯片桌上
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
即使模板中没有相应的行(即幻灯片中的模板id
为空)或自定义幻灯片中,也应返回用户幻灯片
和幻灯片
中的所有行(即,如果幻灯片id
不是自定义幻灯片,因此在自定义幻灯片
表中不存在)
但是,您应该在应用程序层(假设有一个应用程序运行查询并使用结果)中有一些逻辑来检查模板id是否为空,如果为空,则使用自定义幻灯片。我认为此查询应该获取您想要的数据:
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
澄清:
这基本上就是您发布的带有一些联接的select查询。
首先,幻灯片
表与幻灯片id相匹配。
然后联接模板
表,外部联接确保仍然包括模板id为NULL的行。最后联接自定义幻灯片
表,但仅当模板id为NULL时。然后使用合并
从自定义幻灯片
或模板
中选择页面名称请相信此查询应获取所需的数据:
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
澄清:
这基本上就是您发布的带有一些联接的select查询。
首先,幻灯片
表与幻灯片id相匹配。
然后联接模板
表,外部联接确保仍然包括模板id为空的行。最后联接自定义幻灯片
表,但仅当模板id为空时。然后使用合并
从自定义幻灯片
或模板
中选择页面名称使用COALESCE是一种很好的触感!使用COALESCE是一种很好的触感!