Php “检索多个数据”;“系列”;只需一个mySQL查询

Php “检索多个数据”;“系列”;只需一个mySQL查询,php,mysql,charts,report,Php,Mysql,Charts,Report,有没有一种方法可以将这两个查询合并为一个查询,这样我就可以检索两个数据“系列”以用于图表绘制,同时还可以维护单个日期的关系 SELECT COUNT(j.id) AS power_count, jd.ber_rcvd FROM jobs j INNER JOIN job_dates jd ON jd.job_id = j.id WHERE j.tech = 7 AND jd.ber_rcvd !=

有没有一种方法可以将这两个查询合并为一个查询,这样我就可以检索两个数据“系列”以用于图表绘制,同时还可以维护单个日期的关系

SELECT 
        COUNT(j.id) AS power_count, jd.ber_rcvd 
    FROM
        jobs j 
        INNER JOIN job_dates jd 
            ON jd.job_id = j.id 
    WHERE j.tech = 7 AND jd.ber_rcvd != '0000-00-00' GROUP BY jd.ber_rcvd;
SELECT 
        COUNT(j.id) AS transport_count, jd.ber_rcvd 
    FROM
        jobs j 
        INNER JOIN job_dates jd 
            ON jd.job_id = j.id 
    WHERE j.tech = 1 AND jd.ber_rcvd != '0000-00-00' GROUP BY jd.ber_rcvd;
我想要的是这样的输出:

power_count | transport_count | ber_rcvd
11 | 3 | 2013-03-01
7 | 1 | 2013-03-02
电源计数|传输计数| ber | rcvd
11 | 3 | 2013-03-01
7 | 1 | 2013-03-02

使用
UNION ALL

SELECT COUNT(j.id) AS ber_count, jd.ber_rcvd 
  FROM jobs j 
       INNER JOIN job_dates jd 
               ON jd.job_id = j.id 
 WHERE j.tech = 7
 UNION ALL
SELECT COUNT(j.id) AS ber_count, jd.ber_rcvd 
  FROM jobs j 
       INNER JOIN job_dates jd 
               ON jd.job_id = j.id 
 WHERE j.tech = 1

但是,
groupby
是一个更好的方法,正如@Seth所建议的那样

使用
UNION-ALL
看起来会是这样的

SELECT COUNT(j.id) AS ber_count, jd.ber_rcvd 
  FROM jobs j 
       INNER JOIN job_dates jd 
               ON jd.job_id = j.id 
 WHERE j.tech = 7
 UNION ALL
SELECT COUNT(j.id) AS ber_count, jd.ber_rcvd 
  FROM jobs j 
       INNER JOIN job_dates jd 
               ON jd.job_id = j.id 
 WHERE j.tech = 1

但是,@Seth建议,
groupby
是一种更好的方法

使用groupby函数:

SELECT j.tech, COUNT( j.id ) AS ber_count 
FROM job j
    INNER JOIN job_dates jd ON jd.job_id = j.id
WHERE j.tech IN ( 7, 1 )
GROUP BY j.tech;
这应该给你两行,一行表示tech=1,一行表示tech=7。使用GROUP BY函数时,COUNT()将应用于每个分组

在回答更新的问题时,请尝试以下操作:

SELECT COUNT( IF(j.tech=7,1,NULL)) AS power_count, COUNT( IF( j.tech = 1, 1, NULL )) AS transport_count, jd.ber_rcvd
FROM
    jobs j 
    INNER JOIN job_dates jd 
        ON jd.job_id = j.id 
WHERE j.tech IN ( 1, 7 ) AND jd.ber_rcvd != '0000-00-00' 
GROUP BY jd.ber_rcvd;

如果不是这样,请发布一些示例数据供我们使用。

使用分组功能:

SELECT j.tech, COUNT( j.id ) AS ber_count 
FROM job j
    INNER JOIN job_dates jd ON jd.job_id = j.id
WHERE j.tech IN ( 7, 1 )
GROUP BY j.tech;
这应该给你两行,一行表示tech=1,一行表示tech=7。使用GROUP BY函数时,COUNT()将应用于每个分组

在回答更新的问题时,请尝试以下操作:

SELECT COUNT( IF(j.tech=7,1,NULL)) AS power_count, COUNT( IF( j.tech = 1, 1, NULL )) AS transport_count, jd.ber_rcvd
FROM
    jobs j 
    INNER JOIN job_dates jd 
        ON jd.job_id = j.id 
WHERE j.tech IN ( 1, 7 ) AND jd.ber_rcvd != '0000-00-00' 
GROUP BY jd.ber_rcvd;

如果不是这样,请发布一些示例数据供我们使用。

也许可以在它们之间添加
UNION
?@MikeChristensen更好的方法是
UNION ALL
请发布建议的更正查询,以便我能看到如何正确实施
UNION
UNION ALL
。谢谢。我想尝试一下
UNION
groupby
,因为我想知道哪一个更快。也许可以在它们之间添加
UNION
?@MikeChristensen更好,但是
UNION ALL
请发布建议的更正查询,这样我就可以看到如何正确地实现
UNION
UNION ALL
。谢谢。我会尝试使用
联合
分组方式
,因为我想知道哪一种更快。请参阅编辑的OP以进一步解释所需的输出。这非常接近,但它会为每个日期生成两行。我需要每个日期都是一行。如果您将
j.tech
groupby
中删除,它将正常工作!谢谢尝试从GROUP BY子句中删除
,j.tech
。你能给我一些样本数据吗?可能是两个表的转储?请查看已编辑的OP以进一步解释所需的输出。这非常接近,但它为每个日期生成两行。我需要每个日期都是一行。如果您将
j.tech
groupby
中删除,它将正常工作!谢谢尝试从GROUP BY子句中删除
,j.tech
。你能给我一些样本数据吗?也许是一堆你的两张桌子?