我试图解决这个问题很多,检查了很多网站,尝试了更多的例子,但没有得到我想要的东西。 我的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返回空结果,没有错误。实际上,应该有东西可以拿来......
答案 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
orders
对suborders
进行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>