在Mysql上选择IF EXISTS THEN ELSE

时间:2014-12-23 20:52:03

标签: php mysql

我试图解决这个问题很多,检查了很多网站,尝试了更多的例子,但没有得到我想要的东西。 我的php页面上的sql逻辑如下所示:

IF (EXISTS (SELECT * FROM suborders WHERE subId = 1))
THEN SELECT * FROM suborders WHERE subId = 1     //if exists just do this sql again
ELSE SELECT id FROM orders WHERE id = 1 LIMIT 1;

Mysql在第一个查询时给出语法错误。所以,我也尝试在下面使用另一种方式:

delimiter //
create procedure test()
begin
IF EXISTS (SELECT * FROM suborders WHERE subId = 1) THEN
SELECT * FROM suborders WHERE subId = 1;
ELSE
SELECT id FROM orders WHERE id = 1 LIMIT 1;
END IF;
end //
delimiter ;

call test();

使用第二个查询mysql返回空结果,没有错误。实际上,应该有东西可以拿来......

3 个答案:

答案 0 :(得分:2)

IF EXISTS (SELECT * FROM suborders WHERE subId = 1 )
BEGIN
   SELECT * FROM suborders WHERE subId = 1
END
ELSE
BEGIN
    SELECT id FROM orders WHERE id = 1 LIMIT 1
END

完整存储过程:

DELIMITER //
 CREATE PROCEDURE sp_select_suborders(IN `p_subId`)
    IF EXISTS (SELECT * FROM suborders WHERE subId = p_subId )
    BEGIN
       SELECT * FROM suborders WHERE subId = p_subId
    END
    ELSE
    BEGIN
        SELECT id FROM orders WHERE id = p_subId LIMIT 1
    END //
 DELIMITER ;

<强>用法:

$stmt = $db->prepare('CALL sp_select_suborders(?)');

答案 1 :(得分:2)

为什么不简单处理php中没有结果的情况?

$yourDBUsage->query("SELECT * FROM suborders WHERE subId = 1"); 

if ($yourDBUsage->count == 0){
   $yourDBUsage->query("SELECT id FROM orders WHERE id = 1 LIMIT 1;");
}

答案 2 :(得分:1)

由于suborders.subId是引用orders.id的外键,因此您可以使用单个LEFT JOIN查询来处理查询逻辑。我更喜欢这种解决方案,因为这意味着您不必单独维护存储过程。所有查询逻辑都与您的应用程序代码捆绑在一起。

通过LEFT JOIN orderssuborders进行suborders,来自NULL的列可能会返回id。在您的应用程序代码中,您可以测试它们是否为空,如果是,请使用orders中的orders代替。此方法实际上将流逻辑传递给您的PHP代码,同时将所有数据库操作填充到一个查询中,该查询将返回一行或多行(如果SELECT orders.id AS orders_id, suborders.* FROM orders LEFT JOIN suborders ON orders.id = suborders.subId WHERE orders.id = ? 中不存在请求的ID,则返回任何行) )

?

在PHP逻辑中,使用适当的值代替suborders执行该查询。提取时,如果suborders没有返回,您将能够立即识别,因为所有NULL列都将为// Assume fetched into $orders foreach ($orders as $order) { if ($order['subId'] === null) { // Use orders.id... // If it is a unique id, this will be the only row // and the loop will terminate here echo $order['orders_id']; } else { // subId has a value, so you can use the other suborders cols echo $order['subId']; echo $order['other_suborder_column']; }

suborders

这样,如果SELECT * FROM suborders匹配并填充列,您就可以遍历整个返回的行集,相当于orders.id。否则,你可以立即打破循环(或者如果orders_id是唯一的,因为我怀疑它是,它只会返回一行suborders和null {{1}})。< / p>