我使用此查询返回返回存储在$ sTable中的歌曲列表以及存储在$ sTable2中的总项目的COUNT。
/*
* SQL queries
* Get data to display
*/
$sQuery = "
SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
FROM $sTable b
LEFT JOIN (
SELECT COUNT(*) AS projects_count, a.songs_id
FROM $sTable2 a
GROUP BY a.songs_id
) bb ON bb.songs_id = b.songsID
$sWhere
$sOrder
$sLimit
";
$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
'projects_count'与'$ sTable'中的列一起放入一个数组中,然后通过JSON吐出并显示在页面上的表格中。
除了歌曲没有链接到它的项目时,这完全不同。它当然会返回NULL。
我想要的只是将任何空值作为'0'返回。
我尝试过COUNT(),COUNT(IFNULL(project_id,0)并使用COUNT(DISTINCT)......
还有: -
SELECT COALESCE(COUNT(*),0) AS projects_count, a.songs_id
一切都没有成功。
有什么想法吗?
答案 0 :(得分:5)
使用COALESCE()
功能。 COALESCE()
至少需要2个参数,按顺序计算,并返回第一个非null参数。因此COALESCE(null, 0)
将返回0
,COALESCE(null, null, null, null, 1)
将返回1
。这是关于COALESCE()
的{{3}}。
在重新阅读您的查询时,您应该能够获得您想要的结果:
SELECT <all the fields you want>, b.songsID, COUNT(*) AS projects_count
FROM $sTable b
LEFT OUTER JOIN $sTable2 bb ON bb.songs_id = b.songsID
$sWhere
GROUP BY b.songsID
$sOrder
$sLimit
就像我说的那样,这应该有效,但有些事情并不合适。
答案 1 :(得分:1)
COALESCE()
返回第一个非null参数。因此,如果您说COALESCE(count(...),0)
它将返回count(...)
如果它不为空,或者如果count(...)
为空则返回0
答案 2 :(得分:1)
您不必使用子查询进行连接。如果没有COALESCE等,以下应该可以正常工作:
SELECT ".str_replace(" , ", " ", implode(", ", $aColumns)).",
SUM(b.songsID is not null) as countprojects
FROM $sTable b
LEFT JOIN $sTable2 a ON a.songs_id=b.songsID
GROUP BY ".str_replace(" , ", " ", implode(", ", $aColumns))."
这将返回countprojects中您要求的内容。
它的工作方式:LEFT JOIN
只是确保您获得所有数据。
您不能使用COUNT
,因为这会为NULL行返回1
。
但是,如果你只是使用布尔值TRUE求值为1和a的事实
boolean FALSE的计算结果为0,你可以SUM
对这些结果进行评估。
答案 3 :(得分:0)
SELECT blahblahblah, IFNULL(bb.projects_count, 0)
FROM $sTable b
etc...
答案 4 :(得分:0)
只需在SELECT之后将这一行添加到您的代码中
IF(projects_count IS NULL,0,projects_count)作为projects_countList
喜欢这个:
$sQuery = "
SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns)).",
IF(projects_countIS NULL, 0, projects_count) As projects_countList
FROM $sTable b
LEFT JOIN (SELECT COUNT(*) AS projects_count, a.songs_id FROM $sTable2 a GROUP BY a.songs_id) bb ON bb.songs_id = b.songsID
$sWhere
$sOrder
$sLimit
";
$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
在MySQL中返回0而不是null
使用
SELECT id,IF(age IS NULL,0,age)from tblUser
与带有连接两个表的count()一起使用
像
SELECT
tblA.tblA_Id,
tblA.Name,
tblC.SongCount,
IF(tblC.SongCount IS NULL, 0, tblC.SongCount) As noOfSong
FROM tblA
LEFT JOIN
(
SELECT
ArtistId,count(*) AS SongCount
FROM
tblB
GROUP BY
ArtistId
) AS tblC
ON
tblA.tblA_Id = NoOfSong.ArtistId
结果是
tblA_Id Name SongCount noOfSong
-----------------------------------------------------
7 HSP NULL 0
6 MANI NULL 0
5 MEET 1 1
4 user NULL 0
3 jaani 2 2
2 ammy NULL 0
1 neha 2 2