2011-08-12 34 views
0

我有一些单独运行良好的查询。这些查询中的每一个涉及用户在搜索结果时可能想要使用的不同类型的过滤器。每个查询都会从数据库中的5个表中获得完全相同的列。我想达到的目标是累积使用过滤器(即通过日期和名称等搜索,或通过地点和状态进行搜索)累计MySQL查询。我如何使用多个FROM语句?

我遇到的问题是将单个查询放在一起以便可以将结果用作下一个查询的起点。我已经阅读了相交以及如何在MySQL中实现,但我不认为我想要这样做,因为为了做到这一点,我将不得不全部运行所有查询,然后找到需要的交集。很多时间。

我想从我认为最小的查询开始,然后获取结果,然后将这些结果作为下一个查询的起点。这可能是下一个查询必须为每个过滤器搜索5000个记录的多个表之间的差异,或者将结果精简到少于200个查询,并且下一个查询已经有了可以使用的表格。

我想我可能是能够使用的语法如:

SELECT * FROM 
    (SELECT * FROM table1, table2, table3 WHERE DATE(trans_date) 
    BETWEEN DATE(from_date) AND DATE(to_date) 
     FROM (SELECT * FROM table1, table2, table3 
     WHERE name = "Joe" AND lname = "Bloggs")) 
WHERE status = "Open" 

这可能吗?

非常感谢

+2

你为什么不只是让像SELECT *语法FROM表1,表2,表3 WHERE DATE(TRANS_DATE)之间date(FROM_DATE)及日期(to_date)AND name =“Joe”AND lname =“Bloggs”AND status =“Open”...不需要子查询imho –

+1

我同意汉斯。这听起来像是一个过早优化的例子。性能方面,您不应该像这样嵌套查询。如果您的表具有适当的索引,则可以将所有条件放在一个WHERE子句中,并且查询优化器将能够制定最佳过滤策略。 – Simon

+0

如果你真的有五个具有完全相同列的表,我认为你有一个数据建模问题。数据是否被分割(每个表中的不同键)或重叠(每个表中的相同键但非关键数据的不同列/值)? – APC

回答

1

一般 - 是的。虽然大多数RDBMS想要内的每个子查询IIRC一个别名,像

SELECT * 
FROM (
SELECT * 
FROM .... 
WHERE ... 
) AS sub1