Php 选择Mysql上是否存在,然后选择ELSE

Php 选择Mysql上是否存在,然后选择ELSE,php,mysql,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;

我已经试着解决这个问题很多,检查了很多网站,尝试了更多的例子,但没有得到我想要的。 我的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;
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在第一次查询时给出了一个语法错误。因此,我也尝试在下面使用另一种方法:

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;
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返回空结果,没有错误。事实上,应该有东西可以拿来

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
完整存储过程:

用法:


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

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

if ($yourDBUsage->count == 0){
   $yourDBUsage->query("SELECT id FROM orders WHERE id = 1 LIMIT 1;");
}
由于suborders.subId是引用orders.id的外键,因此可以使用单个左联接查询来处理查询逻辑。我更喜欢这种解决方案,因为它意味着您不必单独维护存储过程。所有查询逻辑都与应用程序代码捆绑在一起

通过从订单到子订单进行左联接,子订单中的列可能返回NULL。在应用程序代码中,您可以测试它们是否为空,如果为空,则使用orders的id。该方法实质上是将流逻辑传输到PHP代码中,同时将所有数据库操作填充到一个查询中,如果请求的id不存在,则该查询将返回一行、多行或无行

在PHP逻辑中,使用适当的值代替?执行该查询?。获取时,您将能够立即识别子订单是否没有返回,因为所有子订单列都将为空


这样,如果子订单匹配并填充列,则可以循环整个返回的行集,相当于从子订单中选择*。否则,您可以立即中断循环,或者如果orders.id像我怀疑的那样是唯一的,它将只返回一行orders\u id和空子订单。

在这种情况下,我认为在PHP中执行逻辑更有意义。subId是orders.id的外键,还是相反?如果它们是相关的,您可以进行左连接,并根据返回的行集处理这些情况。从数据方面来看,该查询似乎很可疑。@RiKo我的意思是选择orders left join子订单,这样子订单列的结果将为空,而orders.id将始终存在。在您的应用程序代码中,您可以检测到这一点并相应地采取行动。@RiKo我继续并键入了我所指的内容。在本例中,这里有两个查询=@RiKo,对。执行第一个操作,如果它返回零行,则执行第二个操作。它比你的尝试更干净,实际上是3个查询。如果它确实返回了一些东西,你会做第一次两次,如果第一次没有返回任何东西,你还会做第一次和第二次。@RiKo那又怎样?不要试图将所有内容都打包成单个查询,除非您的数据库每秒只能处理3个查询:它不会介意数千个查询,实际上我的查询并不简单;在这里,我编写了一个简单的查询,例如:1064-您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以了解在第行“IF EXISTS SELECT*FROM suborders WHERE subId=1 BEGIN SELECT*FROM su”附近使用的正确语法1@MichaelBerkowski是的,我知道这一点,我这样写是因为他提到他想使用SPYou is right@Mike我也不会使用通配符,sp返回不同的resultset模式肯定不是一个好主意。不幸的是,不可能同时接受两个答案。我指的是你和梅达的答案;
SELECT
  orders.id AS orders_id,
  suborders.*
FROM
  orders
  LEFT JOIN suborders ON orders.id = suborders.subId
WHERE orders.id = ?
// 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'];
  }