2011-11-02 86 views
2

我一直困惑于如何将多个MySQL查询合并为一个。我一直拉着我的头发,试图做到以下几点。首先,我做一个查询来获取每个供应商的结果,有多少产品有:当有多行时,如何组合MySQL查询和子查询?

SELECT vendor_name, COUNT(vendor_name) AS cnt FROM products GROUP BY vendor_name 

接下来,我只希望那些谁拥有10种或更多产品的供应商,我做了以下PHP IF语句。我不知道如何在上面的SELECT中加入这个,所以我通过PHP来完成。我知道,这是不是最好的,但是当你不知道的最好的方式,你需要做的一些方法:

if ($database_row['cnt']>=10) { 

在这个IF语句,然后我做每一个厂商的查询有10个或更多产品:

SELECT id FROM products WHERE vendor_name="'.$database_row['vendor_name'].'" 

哪给出了每个产品的ID至少有10个产品的供应商。我知道,这是sl,,但它会产生正确的结果。问题是,我需要所有这一切都在一个查询中,对于我的生活我无法弄清楚。这两个查询都在同一个数据库中,而且它似乎并不是一个复杂的请求,这实际上只是“向我展示那些拥有10个或更多产品的供应商的产品”。

以上可以组合成一个查询吗?目前完整的PHP/MySQL代码如下:

$database_result = @mysql_query('SELECT vendor_name, COUNT(vendor_name) AS cnt FROM products GROUP BY vendor_name',$database_conn); 
while($database_row = @mysql_fetch_array($database_result)) { 
    if ($database_row['cnt']>=10) { 
    $database_result2 = @mysql_query('SELECT id FROM products WHERE vendor_name="'.$database_row['vendor_name'].'"',$database_conn); 
    // Process results 
    } 
} 

在此先感谢!


下面是完整的单个查询,现在完全按照我的意愿工作。也许有一种巧妙的方式来优化查询,但它工作起来并且看起来足够快。谢谢大家!

SELECT 
    p3.* 
FROM 
(
    SELECT 
    p1.id, 
    p1.department, 
    p1.end_date, 
    p1.quantity_sold, 
    p2.vendor_name 
    FROM 
    products p1 
    INNER JOIN 
    (
    SELECT 
     vendor_name 
    FROM 
     products 
    GROUP BY 
     vendor_name 
    HAVING 
     COUNT(*) >= 10 
) p2 
    ON 
    p1.vendor_name = p2.vendor_name 
    AND 
    p1.sold_out = 0 
    AND 
    p1.end_date > NOW() 
    ORDER BY 
    p1.end_date DESC 
) AS p3 
GROUP BY 
    p3.vendor_name 
ORDER BY 
    p3.quantity_sold DESC 
+0

不知道为什么你有SELECT P3。*和GROUP BY p3.vendor_name。根据我的估算,这将给每个vendor_name一行,但其他信息将不可靠(即,您不能依赖来自哪个产品行)。 – liquorvicar

回答

3

试试这个

SELECT 
    p1.id, 
    p1.vendor_name 
FROM 
    products p1 
    INNER JOIN 
    (
     SELECT 
      vendor_name, 
      COUNT(vendor_name) as productCount 
     FROM 
      products 
     GROUP BY 
      vendor_name 
     HAVING 
      productCount >= 10 
    ) p2 
    ON p1.vendor_name=p2.vendor_name 
+0

+1可能是MySQL上的最佳解决方案。 – Johan

+0

这很好!我添加了一些必需的好东西,所以正确的数据被选中和排序,结果是完美的。谢谢! –

1

添加having子句。

SELECT vendor_name, COUNT(vendor_name) AS cnt 
FROM products 
GROUP BY vendor_name 
HAVING cnt >= 10 

有像where除了它是评价后,所有其他条款完成。
这意味着它可以使用聚合子句。
但是它不能使用索引。

第二个查询它写成:

SELECT id, vendorname FROM products p WHERE p.vendor_name IN 
    (SELECT p2.vendor_name 
    FROM products p2 
    GROUP BY p2.vendor_name 
    HAVING COUNT(*) >= 10) 

内部联接可能会更快,看到@ liquorvicar的答案了点。

+0

照顾第一个组合,非常感谢。我当然试图使用WHERE哪些不起作用。我怎么住这么久而不知道HAVING?再次感谢。 –