如何在MySQL中获得结果(行)数?

时间:2014-10-11 09:21:14

标签: mysql sql

通常,下面的查询只给我一个结果(行)。

SELECT
    `s`.`FIRMA_UNVANI` AS `FIRMA_UNVANI`,
    `s`.`RECNO` AS `RECNO`,
    `s`.`BOLGE` AS `BOLGE`,
    `s`.`BOLGE_NO` AS `BOLGE_NO`,
    `s`.`DURUM` AS `DURUM`,
    l.ILCE,
    IL.SEHIR,
    count(i.recno) AS NUMBER_OF_WORKS
FROM
    `SERVISLER` `s`
LEFT JOIN KULLANICI k ON (s.BOLGE = k.KULLANICI)
LEFT JOIN kullanici_cihaz kc ON (k.RECNO = kc.KUL_RECNO)
LEFT JOIN servisler_ilceler c ON (s.RECNO = c.SER_RECNO)
INNER JOIN ILCE l ON (l.RECNO = c.ILCE_RECNO)
INNER JOIN IL ON (IL.ID = l.ILID)
LEFT JOIN ISEMRI i ON (
    i.bolge = s.bolge_no
    AND i.`SERVIS_DURUMU` = 1
)
WHERE
    1 = 1
GROUP BY
    s.BOLGE
ORDER BY
    IS_SAYISI
LIMIT 0,
 15

我只得到一个结果

+----------------+-------+------+---------+------+-----+----------+-----------------+
|FIRMA_UNVANI    |RECNO  |BOLGE |BOLGE_NO |DURUM |ILCE | SEHIR    | NUMBER_OF_WORKS |
+----------------+-------+------+---------+------+-----+----------+-----------------+
|Pirana          |2501   |Tekkt |58       |-1    |NT   |Istanbul  |1428             |
+----------------+-------+------+---------+------+-----+----------+-----------------+

这里的关键是RECNO。

我想算一下结果:

SELECT
    count(0) AS _count
FROM
    `SERVISLER` `s`
LEFT JOIN KULLANICI k ON (s.BOLGE = k.KULLANICI)
LEFT JOIN kullanici_cihaz kc ON (k.RECNO = kc.KUL_RECNO)
LEFT JOIN servisler_ilceler c ON (s.RECNO = c.SER_RECNO)
INNER JOIN ILCE l ON (l.RECNO = c.ILCE_RECNO)
INNER JOIN IL ON (IL.ID = l.ILID)
LEFT JOIN ISEMRI i ON (
    i.bolge = s.bolge_no
    AND i.`SERVIS_DURUMU` = 1
)
WHERE
    1 = 1
GROUP BY
    s.BOLGE

我得到了这个有线结果:

1428

应该是1。不是吗?

2 个答案:

答案 0 :(得分:3)

结果非常好,因为你只是为每一行而不是i.recno计算一个0,因此两者都产生了1428。

要计算结果数量,您可以像这样包装整个查询以获得resultcount

SELECT count(*) AS resultcount FROM (
    SELECT
        `s`.`FIRMA_UNVANI` AS `FIRMA_UNVANI`,
        `s`.`RECNO` AS `RECNO`,
        `s`.`BOLGE` AS `BOLGE`,
        `s`.`BOLGE_NO` AS `BOLGE_NO`,
        `s`.`DURUM` AS `DURUM`,
        l.ILCE,
        IL.SEHIR,
        count(i.recno) AS NUMBER_OF_WORKS
    FROM
        `SERVISLER` `s`
    LEFT JOIN KULLANICI k ON (s.BOLGE = k.KULLANICI)
    LEFT JOIN kullanici_cihaz kc ON (k.RECNO = kc.KUL_RECNO)
    LEFT JOIN servisler_ilceler c ON (s.RECNO = c.SER_RECNO)
    INNER JOIN ILCE l ON (l.RECNO = c.ILCE_RECNO)
    INNER JOIN IL ON (IL.ID = l.ILID)
    LEFT JOIN ISEMRI i ON (
        i.bolge = s.bolge_no
        AND i.`SERVIS_DURUMU` = 1
    )
    GROUP BY
        s.BOLGE
    ORDER BY
        IS_SAYISI
    LIMIT 0, 15) AS temp

另请注意,WHERE 1=1不是必需的。

答案 1 :(得分:2)

您在查询中使用了GROUP BY,因此您将在结果中获得每个组的计数,例如,如果有3个组,那么您将获得3计数结果..

如果您需要获取结果行的数量,请使用子查询,请参阅下面的

SELECT count(0) AS _count FROM(
  SELECT
     *
   FROM
    `SERVISLER` `s`
   LEFT JOIN KULLANICI k ON (s.BOLGE = k.KULLANICI)
   LEFT JOIN kullanici_cihaz kc ON (k.RECNO = kc.KUL_RECNO)
   LEFT JOIN servisler_ilceler c ON (s.RECNO = c.SER_RECNO)
   INNER JOIN ILCE l ON (l.RECNO = c.ILCE_RECNO)
   INNER JOIN IL ON (IL.ID = l.ILID)
   LEFT JOIN ISEMRI i ON (
    i.bolge = s.bolge_no
    AND i.`SERVIS_DURUMU` = 1
   )
   WHERE
    1 = 1
   GROUP BY
     s.BOLGE
) AS Temp;