MySQL多表选择查询

MySQL多表选择查询,mysql,Mysql,假设你有3张桌子 articles(id,id_cat) categories(id) messages(id,id_cat,id_article) …如果文章与类别相关,而消息可以与文章或类别相关,则用户可以在类别或文章中发布消息 在假设的current category id=55中,我可以执行哪个查询来列出当前类别和属于当前类别的文章中发布的所有消息 -联合解决方案- Poodlehat建议使用UNION,对于这个特殊问题,它将是: SELECT * FROM ( (SELECT m.i

假设你有3张桌子

articles(id,id_cat)
categories(id)
messages(id,id_cat,id_article)
…如果文章与类别相关,而消息可以与文章或类别相关,则用户可以在类别或文章中发布消息

在假设的current category id=55中,我可以执行哪个查询来列出当前类别和属于当前类别的文章中发布的所有消息

-联合解决方案-

Poodlehat建议使用UNION,对于这个特殊问题,它将是:

SELECT * FROM (
(SELECT m.id FROM messages AS m INNER JOIN categories AS c ON c.id=m.id_cat 
WHERE m.id_cat=55) 
UNION 
(SELECT m.id FROM messages AS m INNER JOIN articles AS a ON a.id=m.id_article 
WHERE a.id_cat=55)
) AS foo
--

现在,没有工会有什么办法可以做到这一点吗?

试试这个:

Select * from 
messages m 
inner join categories c on (m.id_cat=c.id)
inner join article a on (c.id=a.id_cat)
where m.id_cat=55
试试这个:

Select * from 
messages m 
inner join categories c on (m.id_cat=c.id)
inner join article a on (c.id=a.id_cat)
where m.id_cat=55
没有工会就这么做,嗯,现在你在挑战我。。。看看这是否有效

SELECT m.id 
FROM messages m LEFT OUTER JOIN articles a ON m.id_article=a.id
WHERE m.id_cat=55 OR a.id_cat=55
没有工会就这么做,嗯,现在你在挑战我。。。看看这是否有效

SELECT m.id 
FROM messages m LEFT OUTER JOIN articles a ON m.id_article=a.id
WHERE m.id_cat=55 OR a.id_cat=55


你试过什么吗?好吧,你能假设只有一个id_cat或id_article被设置,另一个为NULL吗?是的,总是其中一个被设置,另一个为NULL你试过什么吗?好吧,你能假设只有一个id_cat或id_article被设置,另一个为NULL吗?是的,总是其中一个被设置,另一个为空这将只过滤类别为55的邮件,他想要类别id为55的所有邮件/文章。@JonH:我认为这没关系,因为如果我们删除where子句,返回的行数将相同,三列a.id\U cat、c.id、m.id\U cat将具有相同的值,然后我们只限制category_id,它等于55,因此不依赖于任何特定的列。结果可能是正确的,但当程序员阅读代码时,他看到您在筛选消息表,而不是整个category。Sashi,这以及您在select语句中显式使用*的事实。当用户想要查看文章/消息时,您过滤不正确,并且还列出了表消息的列。所有这些都是良好编程实践的一部分,并清楚地定义了OP要查找的内容。此外,您的声明假设消息通过使用内部联接与文章相关联,海报上说可能不是,它可能只是在未附加文章的类别中。这将仅过滤类别为55的消息,他希望所有邮件/文章的类别id为55。@JonH:我认为这没关系,因为如果我们删除where子句,返回的行数将是相同的,并且a.id\u cat、c.id、m.id\u cat三列的值将是相同的,那么我们只限制类别id等于55,因此,这并不取决于任何特定的列结果可能是正确的,但当程序员阅读您的代码时,他会看到您在筛选消息表,而不是整个类别。Sashi,以及您在select语句中显式使用*的事实。当用户想要查看文章/消息时,您过滤不正确,并且还列出了表消息的列。所有这些都是良好编程实践的一部分,并清楚地定义了OP要查找的内容。此外,您的声明假设消息通过使用内部联接与文章相关联,海报上说可能不是,它可能只是在一个没有附加文章的类别中消息表中的数据是什么?在类别=55中,我希望获得所有消息:1与类别55相关2与类别55相关的文章我想知道您是否在没有联合的情况下执行此操作,然后运行解释优化器结果会有多大不同。消息表中的数据如何?在类别=55中,我希望得到所有的信息:1是与55类相关的2是与55类相关的文章我想知道你是否在没有联合的情况下这样做,然后运行一个解释优化器结果会有多大的不同。