带有两个不同 where 子句的内/左连接

Posted

技术标签:

【中文标题】带有两个不同 where 子句的内/左连接【英文标题】:Inner/Left join with two different where clauses 【发布时间】:2014-01-02 00:31:10 【问题描述】:

我正在两个不同条件下将两个表连接在一起。例如,假设我有以下嵌套查询:

$Query = $DB->prepare("SELECT ID, Name FROM modifications
WHERE TYPE =1 & WFAbility = '0'");
$Query->execute();
$Query->bind_result($Mod_ID,$Mod_Name); 

这个查询:

$Query= $DB->prepare("SELECT `ModID` from `wfabilities` WHERE `WFID`=?");
$Query->bind_param();
$Query->execute();
$Query->bind_result();
while ($Query->fetch())  

基本上,我想选择类型等于1且能力等于0的所有元素,这是从修改表中选择的。

我还需要从 wfabilities 中选择所有 ID,但将它们转换为位于修改中的名称,其中 WFID 等于另一个查询的结果。

这是我目前的半工作代码。

$Get_ID = $DB->prepare("SELECT ID FROM warframes WHERE Name=?");
        $Get_ID->bind_param('s',$_GET['Frame']);
        $Get_ID->execute();
        $Get_ID->bind_result($FrameID);
        $Get_ID->fetch();
        $Get_ID->close();
            echo $FrameID;
            $WF_Abilties = $DB->prepare("SELECT ModID FROM `wfabilities` WHERE WFID=?");
            $WF_Abilties->bind_param('i',$FrameID);
            $WF_Abilties->execute();
            $WF_Abilties->bind_result($ModID);
                $Mod_IDArr = array();
            while ($WF_Abilties->fetch())
                $Mod_IDArr[] = $ModID;
            
            print_r($Mod_IDArr);
                $Ability_Name = array();
                foreach ($Mod_IDArr AS $AbilityMods)
                    $WF_AbName = $DB->prepare("SELECT `Name` FROM `modifications` WHERE ID=?");
                    $WF_AbName->bind_param('i',$AbilityMods);
                    $WF_AbName->execute();
                    $WF_AbName->bind_result($Mod_Name);
                    $WF_AbName->fetch();
                        $Ability_Name[] = $Mod_Name;
                
            print_r($Ability_Name);

【问题讨论】:

我可以发布方案,我会说更准确的答案。 @dimimpou 看看我的半工作代码,它应该解释得更多 好的,我明白了。我会更新 【参考方案1】:

见下文:

SELECT ModID, 
     ID,
     Name
FROM modifications M    
LEFT JOIN wfabilities WF
    ON WF.ModID = M.ID
WHERE TYPE =1 & WFAbility = '0'

【讨论】:

【参考方案2】:

要做到这一点,你需要加入你的桌子,我不太确定你想做什么,所以你可能需要给我更多信息,但这是我的猜测。

SELECT ID, Name, ModID 
FROM modifications
JOIN wfabilities 
  ON WFID = ID
WHERE TYPE = '1' 
  AND WFAbility = '0'

在这个版本中,我在 WFID 等于 ID 时连接表。你必须准确地告诉我什么应该与你的要求挂钩。

要了解有关联接及其作用的更多信息,请查看此页面:mysql Join

编辑:

查看你的大结构后,我可以看到你可以这样做:

SELECT modifications.Name FROM modifications
JOIN wfabilities on wfabilities.ModID = modifications.ID
JOIN warframes on warframes.ID = wfabilities.WFID
WHERE warframes.Name = 'the name you want'

此查询将从战甲名称中为您获取一个能力名称数组。

【讨论】:

看看我的半工作代码,它应该解释得更多【参考方案3】:

这是查询:

"SELECT A.ID, A.Name,B.ModID,C.Name
FROM modifications as A 
LEFT JOIN wfabilities as B ON A.ID = B.WFID 
LEFT JOIN warframes as C ON C.ID = B.WFID 
WHERE A.TYPE =1 AND A.WFAbility = '0' AND C.Name = ?"

【讨论】:

以上是关于带有两个不同 where 子句的内/左连接的主要内容,如果未能解决你的问题,请参考以下文章

日期字段上的左连接 + Where 子句

Linq:选择不同的对象左连接

将左连接重写为索引视图的 where 子句

与 where 子句不工作的左连接

SQL左连接与JOIN条件中的过滤器与WHERE子句中的过滤器[重复]

左连接的where子句中的Mysql查询错误