2011-01-06 16 views
2

テーブルaとテーブルb(1対多の関係)からレコードを返すはずの次のMySQLクエリと、テーブルcから返された値のカンマ区切りリストが得られました。しかし、テーブルCには常にレコードが存在するとは限りません(これが、テーブルAにLEFT OUTER JOINを使用している理由です)。それは2レコード1は、表Cに3つの一致するレコードを有する返すべき場合group_concatのヌル値を返した行が返されない

SELECT `a`.`id` , `a`.`name` , `b`.`id` AS `b_id` , `b`.`name` AS `b_name` , GROUP_CONCAT( `c`.`l_id`) AS `c_ls` 
FROM `a` 
INNER JOIN `b` ON `a`.`b_id` = `b`.`id` 
LEFT OUTER JOIN `c` ON `a`.`id` = `c`.`a_id` 
GROUP BY `a`.`id` 
ORDER BY `a`.`created` DESC 

上記クエリが1つのレコードを返し、レコード2は、表Cに0一致するレコードを有します。

クエリが返します。

id | name | b_id | b_name | c_ls 
1 | John | 2 | Bla | [BLOB - 3 B] 

私はGROUP_CONCATとGROUP_BY条項を削除した場合、それは2つのレコードを返します。

id | name | b_id | b_name | c_ls 
1 | John | 2 | Bla | [BLOB - 3 B] 
2 | Fred | 3 | Blo | [BLOB - NULL] 

c_lsがnullの場合、GROUP_CONCATがあることから行を停止しているようです戻ってきた。私が間違ってやっていることに関する考えは?

SELECT `a`.`id` , `a`.`name` , `b`.`id` AS `b_id` , `b`.`name` AS `b_name` , ISNULL(GROUP_CONCAT( `c`.`l_id`), '') AS `c_ls` 
FROM `a` 
INNER JOIN `b` ON `a`.`b_id` = `b`.`id` 
LEFT OUTER JOIN `c` ON `a`.`id` = `c`.`a_id` 
GROUP BY `a`.`id` 
ORDER BY `a`.`created` DESC 

追加ISNULLはGROUP_CONCATがnullであるかどうかをチェックし、代わりにNULLの空白返すために -

答えて

5

これまでの回答は、残念ながら間違っています(コメントに記載されているように)。

IFNULLを読む必要があります[ISNULLでは、isnullはただ1つのパラメータを取り、ブール値を返します]!

SELECT `a`.`id` , `a`.`name` , `b`.`id` AS `b_id` , `b`.`name` AS `b_name` , 
IFNULL(GROUP_CONCAT( `c`.`l_id`), '') AS `c_ls` 
FROM `a` 
INNER JOIN `b` ON `a`.`b_id` = `b`.`id` 
LEFT OUTER JOIN `c` ON `a`.`id` = `c`.`a_id` 
GROUP BY `a`.`id` 
ORDER BY `a`.`created` DESC 

しかし、これがすべてでは解決策ではありません:nullの場合

IFNULLは、第二PARAMTERを返します!私たちが必要なもの が参加する "複雑" である -

だから、このSQLフィドルを確認してください。 http://www.sqlfiddle.com/#!2/54c6f/3/0

2

これを試してみてくださいJOINの代わりにINNER JOINをLEFTのを使用してみてください。

+0

おかげで、完璧に働きました! – RichW

+2

クエリロジックが 'ISNULL() 'の代わりに' coalesce(field_name、' ') 'を使用するほうが良いでしょう。 – sakhunzai

+1

これは'ネイティブ関数' isnull ' –

関連する問題