MySQL: JOIN 和条件语句
MySQL: JOIN and Conditional Statement
谁能帮我破译查询所需代码的正确逻辑?我只是找不到关于此的解决方案,或者我的搜索查询可能只是含糊不清。哈哈
我查询了一下,之前觉得还好,但是我现在才意识到,这些不准确。以下是我尝试过的方法:
来自搜索页面,例如我们有这个变量:
$variable = !empty($_POST["variable"]) ? $_POST['variable'] : "";
查询 1
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
WHERE table2.column LIKE '%$variable%'
结果 1
- 如果
$variable
没有值,则仅显示来自 table2
的相应数据的行。
- 如果
$variable
有一个值,则显示具有来自 table2
的相应数据和匹配值的行。
查询 2
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
AND table2.column LIKE '%$variable%'
结果 2
- 如果
$variable
没有值,则显示所有行。
- 如果
$variable
有值,所有行仍然显示。
期望的结果
- 如果
$variable
没有值,将显示所有行。
- 如果
$variable
有值,则包含来自 table2
的相应数据的行
并显示匹配值。
我已经尝试使用 IF
、CASE
和 LEFT OUTER JOIN
(我在某处找到的东西),但仍然没有成功。我在这里忘记了什么吗?还是我做错了(这是事实)?
我有另一种方法,那就是使用带有 PHP 的条件语句(这将是我最后的选择) 但是如果 [=82 可以做到这一点=] 只有这样才叫万岁。
您可以使用类似的东西:
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
AND (table2.column LIKE '%$variable%' OR $variable = '' OR $variable IS NULL)
如果 $variable
为 NULL
或为空,则查询将返回 所有 条记录。否则,只返回匹配的记录。
你需要检查连接条件,必须使用内部连接
$sql = "SELECT
...
...FROM table1";
if(!empty($variable)){
$sql = $sql." INNER JOIN table2 ON table1.column_id = table2.column_id WHERE table2.column LIKE '%$variable%'";
}
好的,我刚刚用 IF
子句给出了另一个镜头,并找出了我能想到的最简单的查询。 它现在给出了想要的结果,这是我的查询:
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
WHERE IF('$variable' != '', table2.column = '$variable', 1 = 1)
我成功地将 IF()
子句放在了正确的位置。如果你们对这段代码有想法或者有比这更好的代码,请分享它:)
[ADDITIONAL]
This is an answer from @ypercubeᵀᴹ and I love it!
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
WHERE table2.column = '$variable' OR '$variable' = ''
SELECT CP.*,CT.* FROM `ChecklistTasks` AS CT LEFT JOIN ChecklistPoints AS CP
ON CT.`pkTID` = CP.`fkTID` AND CP.`CheckPointName` LIKE '%var%'
或
SELECT CP.*,CT.* FROM `ChecklistTasks` AS CT LEFT JOIN ChecklistPoints AS CP
ON CT.`pkTID` = CP.`fkTID` AND CP.`CheckPointName` LIKE '%%'
到目前为止你的查询是正确的..它正在处理正确的结果..你想要
谁能帮我破译查询所需代码的正确逻辑?我只是找不到关于此的解决方案,或者我的搜索查询可能只是含糊不清。哈哈
我查询了一下,之前觉得还好,但是我现在才意识到,这些不准确。以下是我尝试过的方法:
来自搜索页面,例如我们有这个变量:
$variable = !empty($_POST["variable"]) ? $_POST['variable'] : "";
查询 1
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
WHERE table2.column LIKE '%$variable%'
结果 1
- 如果
$variable
没有值,则仅显示来自table2
的相应数据的行。 - 如果
$variable
有一个值,则显示具有来自table2
的相应数据和匹配值的行。
查询 2
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
AND table2.column LIKE '%$variable%'
结果 2
- 如果
$variable
没有值,则显示所有行。 - 如果
$variable
有值,所有行仍然显示。
期望的结果
- 如果
$variable
没有值,将显示所有行。 - 如果
$variable
有值,则包含来自table2
的相应数据的行 并显示匹配值。
我已经尝试使用 IF
、CASE
和 LEFT OUTER JOIN
(我在某处找到的东西),但仍然没有成功。我在这里忘记了什么吗?还是我做错了(这是事实)?
我有另一种方法,那就是使用带有 PHP 的条件语句(这将是我最后的选择) 但是如果 [=82 可以做到这一点=] 只有这样才叫万岁。
您可以使用类似的东西:
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
AND (table2.column LIKE '%$variable%' OR $variable = '' OR $variable IS NULL)
如果 $variable
为 NULL
或为空,则查询将返回 所有 条记录。否则,只返回匹配的记录。
你需要检查连接条件,必须使用内部连接
$sql = "SELECT
...
...FROM table1";
if(!empty($variable)){
$sql = $sql." INNER JOIN table2 ON table1.column_id = table2.column_id WHERE table2.column LIKE '%$variable%'";
}
好的,我刚刚用 IF
子句给出了另一个镜头,并找出了我能想到的最简单的查询。 它现在给出了想要的结果,这是我的查询:
SELECT
...
...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id
WHERE IF('$variable' != '', table2.column = '$variable', 1 = 1)
我成功地将 IF()
子句放在了正确的位置。如果你们对这段代码有想法或者有比这更好的代码,请分享它:)
[ADDITIONAL]
This is an answer from @ypercubeᵀᴹ and I love it!
SELECT ... ... FROM table1 LEFT JOIN table2 ON table1.column_id = table2.column_id WHERE table2.column = '$variable' OR '$variable' = ''
SELECT CP.*,CT.* FROM `ChecklistTasks` AS CT LEFT JOIN ChecklistPoints AS CP
ON CT.`pkTID` = CP.`fkTID` AND CP.`CheckPointName` LIKE '%var%'
或
SELECT CP.*,CT.* FROM `ChecklistTasks` AS CT LEFT JOIN ChecklistPoints AS CP
ON CT.`pkTID` = CP.`fkTID` AND CP.`CheckPointName` LIKE '%%'
到目前为止你的查询是正确的..它正在处理正确的结果..你想要