1

この質問は、2012 年 3 月に回答された質問の続きです。これは 4 か月後のことなので、新しい質問を提起しました。参照: MySQL LEFT JOIN - 値は NULL にすることができます

現状の私のSQL文は以下のとおりです。

SELECT cs.case_id, cs.child_firstname, gu.* 
FROM tblcases AS cs 
LEFT JOIN tblguardians AS gu 
ON cs.case_id = gu.case_id AND gu.firstname LIKE '%Craig%'
WHERE cs.child_firstname LIKE '%Sally%' 

これはうまくいきます:

  1. 両方の値が設定されている場合 (上記の例による)。
  2. cs.child_firstname が設定されていて、gu.firstname がワイルドカードのみの場合

ただし、cs.child_firstname がワイルドカードのみで、gu.firstname が設定されている場合、NULL 値を含むデータベース内のすべての行が返されます。理想的には、その状況では NULL 値は必要ありません。

このクエリを書き直してすべてを実行できますか、それとも複数のクエリが必要ですか?

アップデート

以下のフィールドは私のフォームのフィールドです。すべて $_POST を使用して渡され、PHP を使用して処理されます。これにより、データがどこから来ているか、データベース テーブルとどのように関連しているかがわかると思います。子フィールドは tblcases にあり、ガーディアン フィールドは tblguardians にあります。

  • お子様の名
  • 子供の姓
  • お子様の生年月日
  • 保護者の名
  • 保護者の姓
  • ガーディアンフォン
  • 保護者の郵便番号

更新 2

SQL クエリは次のようになりました。

SELECT 
    DISTINCT(cs.case_id) AS case_id, CONCAT(cs.child_firstname, ' ', child_surname) AS childname, DATE_FORMAT(child_dob, '%d/%m/%Y') AS child_dob, DATE_FORMAT(created, '%d/%m/%Y') AS created, gu.firstname, gu.surname
FROM 
    tblcases AS cs 
LEFT JOIN tblguardians AS gu 
    ON cs.case_id = gu.case_id 
    AND gu.firstname LIKE '%$_POST[parent_firstname]%'
    AND gu.surname LIKE '%$_POST[parent_lastname]%'
WHERE 
cs.child_firstname LIKE '%$_POST[child_firstname]%' 
AND cs.child_surname LIKE '%$_POST[child_surname]%'
AND ('$_POST[child_firstname]' != '' OR gu.firstname IS NOT NULL)
4

1 に答える 1

0

理想的な解決策は「完全結合」のように聞こえます-両方のテーブルからすべての行を返し、where句を使用して「両側がnull」の場所を削除します-たとえば、ifnull(gu.firstname、cs.child_firstname)はそうではありませんヌル

Mysqlは完全結合をサポートしていないため、最適なオプションは次のような結合になります。

select blah
from tblcases 
join tblguardians on blah
where tblcases.child_firstname like childINPUT

union

select blah -- same blah as aobve
from tblcases 
join tblguardians on blah
where tblguardians.firstname like guardianINPUT
于 2012-11-17T16:42:05.733 に答える