MySQL:JOIN和条件语句

时间:2016-06-09 06:04:37

标签: php mysql join logic conditional

可以帮我解读查询所需的正确代码逻辑吗?我只是找不到关于这个的解决方案,或者我的搜索查询可能只是含糊不清。洛尔。

我做了一个查询并且在它没事之前想了想但是我刚才意识到这些不准确。以下是我的尝试:

从搜索页面,例如我们有这个变量:

$variable = !empty($_POST["variable"]) ? $_POST['variable'] : "";

QUERY 1

SELECT
    ...
    ...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id 
WHERE table2.column LIKE '%$variable%'

结果1

  • 如果$variable没有值,则只会显示包含table2各自数据的行。
  • 如果$variable有值,则会显示包含table2的相应数据和匹配值的行。

QUERY 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的相应数据的行 并将显示匹配值。

我已经尝试过使用IFCASELEFT OUTER JOIN (我在某处找到的东西),但仍然没有运气。我忘了这里的东西吗?或者我做错了(这是事实)

我有另一种方法,那就是使用带有PHP 的条件语句(这将是我的最后一个选项)但是如果只有MySQL可以做到这一点那么它就是一个万岁。

4 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

SELECT
    ...
    ...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id 
     AND (table2.column LIKE '%$variable%' OR $variable = '' OR $variable IS NULL)

如果$variableNULL或为空,则查询将返回所有记录。否则,仅返回匹配的记录。

答案 1 :(得分:1)

您需要检查连接条件,必须使用内连接

$sql = "SELECT
...
...FROM table1";

if(!empty($variable)){
$sql = $sql." INNER JOIN table2 ON table1.column_id = table2.column_id WHERE table2.column LIKE '%$variable%'";
}

答案 2 :(得分:1)

好的,我刚刚用IF条款再次拍摄,并找出了我能想到的最简单的查询。 现在正在提供所需的结果,这是我的查询:

SELECT
    ...
    ...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id 
WHERE IF('$variable' != '', table2.column = '$variable', 1 = 1)

成功地,我将IF()条款放在了正确的位置。如果你们对这段代码有所了解或者有一个比这更好的代码,请分享它:)

  

<强> [追加]

     

这是@ypercubeᵀᴹ的answer,我喜欢它!

SELECT
    ...
    ...
FROM table1
LEFT JOIN table2 ON table1.column_id = table2.column_id 
WHERE table2.column = '$variable' OR '$variable' = ''

答案 3 :(得分:1)

    SELECT CP.*,CT.* FROM `ChecklistTasks` AS CT LEFT JOIN ChecklistPoints AS CP 
    ON CT.`pkTID` = CP.`fkTID` AND CP.`CheckPointName` LIKE '%var%'

OR

    SELECT CP.*,CT.* FROM `ChecklistTasks` AS CT LEFT JOIN ChecklistPoints AS CP 
    ON CT.`pkTID` = CP.`fkTID` AND CP.`CheckPointName` LIKE '%%'

到目前为止,您的查询是正确的...它正在处理正确的结果..您想要