2011-11-07 206 views
0

我访问数据我的网站上有3个查询,第一次查询得到交易的网站上提供的完整列表:加入MySQL的子查询

$listingquery = "SELECT * FROM table WHERE city = '$city' AND approved = '1' 
    AND enddate > NOW() ORDER BY id DESC"; 

下一个查询获取可用的交易商的数/列表:

$providerquery = "SELECT programname, category, COUNT(name) FROM table WHERE 
    city = '$city' AND approved='1' AND enddate > NOW() GROUP BY provider"; 

和第三查询获取类别的计数/列表在这个城市提供的交易商:

$categoryquery = "SELECT programname, category, COUNT(name) FROM table WHERE 
    city = '$city' AND approved='1' AND enddate > NOW() GROUP BY category"; 

有没有办法将所有这一切合并为一个查询?

在此先感谢!

+0

你的第二个查询有一些有趣之处:你的意思是选择'provider'列而不是'category'?另外,你不是通过'programname'在第二个或第三个查询中进行分组; MySQL允许这样做,但可能会返回随机结果,除非每个提供者/类别都保证只有一个程序名。 –

+0

是的,这是一个错误,试图一次做15件事情,它按程序名 – Mike

回答

0

你可能会得到一些无损的信息,但你可以试试这个:

SELECT * FROM table a 
    LEFT JOIN (
    SELECT programname, category, COUNT(name) 
    FROM table 
    WHERE city = '$city' AND approved='1' AND enddate > NOW() GROUP BY provider 
) b ON a.provider = b.provider 
    LEFT JOIN (
    SELECT programname, category, COUNT(name) 
    FROM table 
    WHERE city = '$city' AND approved='1' AND enddate > NOW() GROUP BY category 
) c ON a.category = b.category 
    WHERE a.city = '$city' AND a.approved = '1' 
    AND a.enddate > NOW() 
    ORDER BY a.id DESC; 

更新一个Where子句(有点):

SELECT * FROM table a 
    LEFT JOIN (
    SELECT programname, category, COUNT(name) 
    FROM table 
    WHERE enddate > NOW() GROUP BY provider 
) b ON a.provider = b.provider 
    LEFT JOIN (
    SELECT programname, category, COUNT(name) 
    FROM table 
    WHERE enddate > NOW() GROUP BY category 
) c ON a.category = b.category 
    WHERE a.city = '$city' AND a.approved = '1' 
    AND a.enddate > NOW() 
    AND b.city = a.city AND c.city = a.city 
    AND b.approved = a.approved AND c.approved = a.approved 
    ORDER BY a.id DESC; 
+0

分组我可以加入并将其拆分WHERE变量只定义一次?对我来说似乎多余。我还是新手,所以我想尽快学习正确的做事方式。 – Mike

+0

@Mike一秒 – Neal

+0

@Mike我最近的更新可能**不是**的路要走。但它在某些方面是正确的 – Neal

0

我怀疑,这一切都是可能的/在单个查询中是可行的,但无论哪种方式,您都不应该在MySQL中使用子查询,否则会严重降低性能。喜欢连接而不是子查询。

+0

我认为我的术语是关闭的。尼尔斯的答案似乎是我使用的最合理的,只是试图使它现在的工作:) – Mike

+0

@Mike祝你好运,如果你有你的解决方案。 –