Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySQL从表中选择,其中。。。和和和_Mysql_Sql_Select - Fatal编程技术网

mySQL从表中选择,其中。。。和和和

mySQL从表中选择,其中。。。和和和,mysql,sql,select,Mysql,Sql,Select,我有一个包含列和数据的表: article_id title body 1 This is the title This is the body text 2 Another title Another body text category_id category 1 localnews 2 visible 3 fi

我有一个包含列和数据的表:

article_id     title               body
1            This is the title   This is the body text
2            Another title       Another body text
category_id    category
1              localnews
2              visible
3              first10
categories_id   article_id  category_id
1               1           1
2               1           2
3               1           3
4               2           1
5               2           3
另一个包含列和数据的表类别:

article_id     title               body
1            This is the title   This is the body text
2            Another title       Another body text
category_id    category
1              localnews
2              visible
3              first10
categories_id   article_id  category_id
1               1           1
2               1           2
3               1           3
4               2           1
5               2           3
以及包含列和数据的表类别:

article_id     title               body
1            This is the title   This is the body text
2            Another title       Another body text
category_id    category
1              localnews
2              visible
3              first10
categories_id   article_id  category_id
1               1           1
2               1           2
3               1           3
4               2           1
5               2           3
我想选择categories.category_id=1和=2和=3的行

我正在使用:

SELECT articles.article_id, articles.title, articles.body, 
categories.article_id, categories.category_id 
FROM articles, categories 
WHERE articles.article_id = categories.article_id 
AND categories.article_id = 1 
AND categories.article_id = 2 
AND categories.article_id = 3 
但它不起作用。显然,mySQL需要另一种语法。 有人能帮忙吗?
谢谢

行中的一列不能同时是1、2或3,这是和规定的。使用或在您的WHERE条件下使用。更好的是,为了可读性,您可以使用:


该值不能同时为所有三个值,因此最好在WHERE中使用IN子句来定义要返回的值。假设您已经有了一个连接条件,那么您也希望将其移动到ON子句;即:

SELECT articles.article_id, articles.title, articles.body, categories.article_id, categories.category_id 
FROM articles
INNER JOIN categories ON articles.article_id = categories.article_id 
WHERE categories.article_id IN ( 1, 2, 3 )
当然,您可以转到下一步并执行以下操作:

SELECT articles.article_id, articles.title, articles.body, category.category
FROM articles
INNER JOIN categories ON articles.article_id = categories.article_id 
INNER JOIN category ON categories.category_id = category.category_id
WHERE categories.article_id IN ( 1, 2, 3 )
如果您希望只显示所有三个类别中出现的文章,则可以采取如下方法:

SELECT articles.article_id, articles.title, articles.body
FROM articles
INNER JOIN categories AS c1
ON articles.article_id = c1.article_id 
AND   c1.category_id = 1
INNER JOIN categories AS c2
ON articles.article_id = c2.article_id 
AND   c2.category_id = 2
INNER JOIN categories AS c3
ON articles.article_id = c3.article_id 
AND   c3.category_id = 3

我对表使用了一些不同的名称,因为在您的示例中,很难注意到类别和类别之间的区别。

除了常用于和使用HAVING count之外,我还希望通过如下方式执行多重连接来了解性能差异

SELECT STRAIGHT_JOIN
      articles.article_id, 
      articles.title, 
      articles.body
   FROM 
      categories c1
         JOIN articles
            on c1.article_id = articles.article_id
         JOIN categories c2
            on c1.article_id = c2.article_id
           AND c2.category_id = 2
         JOIN categories c3
            on c1.article_id = c3.article_id
           AND c3.category_id = 3
  WHERE
     c1.Category_ID = 1
是的,这看起来很模糊,但让我们想想。。。通过在categories表上首先执行联接,其中一个特定类别-类别的第一个实例应该代表粒度最小的类别。例:你的本地新闻分类,可见和前10。本地新闻可能拥有最多的条目,而可视新闻和前10条的条目则更少。。。其中,记录数最少的。将此类别用作where子句

假设你有100000篇文章,90000篇在本地新闻,45000篇在可见,12000篇在前10篇。通过仅对12000中的数据进行查询,可以消除大部分数据

然后加入到articles表,并根据其他条件(如果找到、完成,如果未找到)再次分类为别名C2和C3


再一次,我想知道它对性能的影响。我还将在categories表中的article_id和category_id上创建一个复合索引

您的查询相当于我想要一辆蓝色和黄色的红色汽车。他正在寻找所有3个类别中的文章。您需要的关系运算符是,通俗地说是。注意事项包括是否以及如何处理和清空除数。从表文章中,我只想选择属于所有三个类别的第一个条目,即localnews、visible和first10。如表categories所示,文章_id=1有类别_id 1、2和3,而第二篇文章没有可见类别,我不想选择它。谢谢你的回答。这将返回文章\u id total 1 3,但不返回标题和正文。@Kostas,好吧,然后更改SELECT和FROM之间的内容。。。我以为您知道如何选择要选择的列右键!我将其更改为选择articles.article\u id、articles.title、articles.body,将categories.article\u id从类别左侧计算为total,使用article\u id将文章加入,其中categories.category\u id在1、2、3中按类别分组。article\u id的总数为3,谢谢您的回答。这个查询返回的正是我想要的。目前,参赛作品比你提到的数字要少得多,而且预计在不久的将来也不会有这么多。如果你想找到属于10个特定类别的文章,该怎么办?我想我必须添加JOIN on和Thanks以获得答案。两个查询都返回两行,但我只需要第一行。@Kostas为什么只需要第一行?我看不到你的问题中提到的?也许我不够清楚。我想要第一个,因为它在类别表中所示的所有三个类别中。@Kostas从原始文本中不清楚这是您想要的-不过,我们也添加了这个案例。谢谢您的回答。我认为IN是OR的缩写,但我需要类似IN的东西,只是AND的缩写。