2017-10-21 53 views
0

我在MySQL中有几个(超过20个)表格,这些表格描述了许多不同级别(颜色,位置等)上的项目。以下是“table01”的示例MySQL:选择一个匹配多行的项目

+----+----------+ 
| 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解决方案?

+0

问题需要更多信息。查询的属性是静态的吗?或者你想为用户定义的属性创建动态查询? –

+0

数据库结构是静态的,表和它们的列(名称)保持不变。项目和属性不时添加 –

+0

我的意思是查询本身是静态的吗?你是否一直在查询相同的属性? –

回答

2

你可以做到这一点,例如,通过做

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

这会给你谁拥有这两个属性ID列表。

然而,它可以增加更多的属性来检查和更难以处理更多的表。如果可能的话,重新考虑你的数据库模式可能更有用,因为它至少有一个包含属性而不是多个属性的表。

+0

谢谢,这应该适用于我 –

0

如下您可以使用@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" 
    [...] 

Click here for Demo

希望它能帮助!

+0

它按预期工作吗? –