この質問は、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%'
これはうまくいきます:
- 両方の値が設定されている場合 (上記の例による)。
- 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)