繁体   English   中英

MySQL:选择与多行匹配的项目

[英]MySQL: Select an item that matches multiple rows

我在MySQL中有几个(超过20个)表,它们在许多不同的级别(颜色,位置等)描述一个项目。 以下是“ table01”的示例

+----+----------+
| ID | property |
+----+----------+
|  1 | A        |
|  1 | B        |
|  2 | C        |
|  2 | B        |
+----+----------+

现在,我要搜索符合多个条件的项目。 以下查询工作正常

SELECT
  table01.ID, table01.property, table02.property, table03.property [...]
FROM
  table01
LEFT JOIN table02 ON table02.ID = table01.ID
LEFT JOIN table03 ON table03.ID = table01.ID
[...]
WHERE
  table01.property = "A"
  and table02.property = "B"
  and table03.property = "A"
  [...]

这是我的问题。 我想在一个表中搜索与几个属性匹配的项目。 例如(此查询显然不起作用)

table01.property = "A" AND table01.property = "B"

我不知道如何实现,因为信息存储在多行中。

有什么建议么? 数据库非常庞大(每个表有数千个条目),并且不时添加新行。 我应该通过PHP进行一些处理还是有一个纯MySQL解决方案?

例如,您可以通过执行

SELECT ID,count(property) AS CNT FROM table01 
WHERE property = 'A' OR  property = 'B'
GROUP BY ID
HAVING CNT=2;

这将为您提供具有这两个属性的ID列表。

但是,随着更多的属性来检查和检查更多表的复杂性,它会变得越来越复杂。 如果有可能,重新考虑数据库架构,使其至少具有一个具有属性而不是多个属性的表可能会更有用。

您可以将@Gnudiff给出的查询与查询一起使用,如下所示:

SELECT
  table01.ID, table01.property, table02.property, table03.property [...]
FROM
  (SELECT *FROM table01 
   WHERE property = 'A' OR  property = 'B'
   GROUP BY ID
   HAVING count(property)=2) as table01
LEFT JOIN table02 ON table02.ID = table01.ID
LEFT JOIN table03 ON table03.ID = table01.ID
[...]
WHERE
  table02.property = "B"
  and table03.property = "A"
  [...]

单击此处进行演示

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM