2011-03-29 98 views
0

首先,我想首先为可能未命名的标题道歉......我很难描述我在这里要做的事情。使用多行的MySQL查询搜索

随着我正在开发的当前项目,我们已经设置了一个“动态”的数据库结构,看起来像这样。

item_details(描述了item_data

fieldID | fieldValue | fieldCaption 

    1 |  addr1 | Address Line 1 

    2 |  country | Country 

item_data

itemID | fieldID | fieldValue 

12345 |  1  | Some Random Address 

12345 |  2  | United Kingdom 

因此,大家可以看到,例如,如果我想查找的地址为项目12345我会只是做这个声明。

SELECT fieldValue FROM item_data WHERE fieldID=1 and itemID=12345;

但这里是我在哪里卡住了...该数据库与周围〜80K行比较大,我想创建PHP内一组搜索功能。

我希望能够尽快完成对结果集查询的查询......

例如,搜索地址名称某一个国家内...即:搜索与同ITEMID的作为结果从查询结果的fieldValue

'SELECT itemID from item_data WHERE fieldID=2 and fieldValue='United Kingdom'..

对不起,如果我不清楚,我一直在努力与这个过去几天...

干杯

回答

1

您可以通过几种方法来做到这一点。一种是对item_data表使用多个连接,并将fieldID限制为任何你想获得的值。

SELECT * 
FROM 
Item i 
INNER JOIN item_data country 
ON i.itemID = country.itemID 
    and fieldid = 2 
INNER JOIN item_data address 
ON i.itemID = country.itemID 
    and fieldid = 1 
WHERE 
    country.fieldValue= 'United Kingdom' 
    and address.fieldValue= 'Whatever' 

顺便这种结构通常被称为Entry Attribute Value or EAV数据库

+0

啊哈就是我需要的!有没有办法只选择INNER JOIN上的特定字段?非常感谢..干杯! – Eddie 2011-03-29 19:38:48

+0

@Eddie如果你愿意,你可以使用[内嵌视图](http://www.orafaq.com/wiki/Inline_view)。这可能会对你的表演有正面或负面的影响,所以一定要测试 – 2011-03-29 20:28:19

+0

我会给它一个镜头,但根据以前的经验,它不会帮助优化...干杯 – Eddie 2011-03-29 20:39:38

0

对不起提前如果这听起来光顾,但(如你所说)我不太清楚你问什么。

如果你正在寻找一个查询来完成整个事情,你可以简单地嵌套它们。举个例子,假设有一个名为CACHED的表,其中包含英国查询的结果,然后写出您想要的查询,但用您的英国查询替换CACHED。

如果您的想法是您已经完成了这个英国查询并希望(重新)使用其结果,那么您可以将结果保存到DB中的表格中(如果有大量数据可能不太实际)或将ID列表保存为文本并将其粘贴到后续查询中(...(...)中的WHERE ID),如果您的“缓存”查询为您提供了一个原始表格的可管理部分。