MySQL:如果select in table X为空,做select in table Y

MySQL: If select in table X is empty, do select in table Y

在一个查询中我想 select 来自 table X 的信息。 但是,如果 table X 没有 return 任何信息,我想从 table Y.

检索数据

除了彼此之外,查询看起来像这样:

SELECT * FROM tableY WHERE user_id=1

SELECT * FROM tableX WHERE id=1

我尝试了以下方法来组合这个,但它似乎不起作用

SELECT * FROM tableY WHERE user_id= 
    IF (EXISTS (SELECT * FROM tableX WHERE id=1), 1, 0)

当然反过来

SELECT * FROM tableX WHERE id= 
    IF (EXISTS (SELECT * FROM tableY WHERE user_id=1), 1, 0)

机器人版本只会执行第一个查询,不会执行第二个查询。 所以我有点被困在这里。

我也试过这个,但是由于 table 没有相同的行,所以这应该行不通...这是正确的,但行不通:

     SELECT * 
     FROM orbib.billing_address 
      WHERE user_id=1
  UNION ALL
      SELECT * 
      FROM orbib.users 
      WHERE id=1
          AND NOT EXISTS 
            (SELECT * 
              FROM orbib.billing_address 
              WHERE user_id=1
              )

还尝试使用 procedure 执行此操作,如此处所述:

然而这也没有用,而且看起来程序被保存了,导致用户id总是1,这当然会有所不同。

也许有人知道如何创建一个能满足我要求的查询?

编辑: 以下是 table 描述:

tableX:

Field       Type            Null    Key     Default     Extra
id          int(11)         NO      PRI     NULL        auto_increment
username    varchar(30)     NO      UNI     NULL        
firstname   varchar(45)     YES             NULL        
lastname    varchar(45)     YES             NULL        
street      varchar(45)     YES             NULL        
street_nr   varchar(10)     YES             NULL        
zipcode     varchar(10)     YES             NULL        
city        varchar(45)     YES             NULL        
password    varchar(255)    NO              NULL        
salt        varchar(255)    NO      UNI     NULL        
email       varchar(255)    NO              NULL        
create_time datetime        NO              CURRENT_TIMESTAMP       
company     varchar(45)     YES             NULL        
branche     varchar(45)     YES             NULL        

tableY:

Field           Type            Null    Key     Default     Extra
id              int(11)         NO      PRI     NULL        auto_increment
user_id         int(11)         NO              NULL        
company         varchar(45)     YES             NULL        
contact_name    varchar(100)    YES             NULL        
street          varchar(45)     YES             NULL        
street_nr       varchar(10)     YES             NULL        
zipcode         varchar(45)     YES             NULL        
city            varchar(45)     YES             NULL        
terms_ok        tinyint(1)      YES             NULL        
billing_ok      tinyint(1)      YES             NULL    

所以根据@kickstart 的想法,我尝试这样做:

SELECT 
     IFNULL(tableY.company, tableX.company) company,
     IFNULL(tableY.contact_name, tableX.lastname) contact,
     IFNULL(tableY.street, tableX.street) street,
     IFNULL(tableY.street_nr, tableX.street_nr) street_nr,
     IFNULL(tableY.zipcode, tableX.zipcode) zipcode,
     IFNULL(tableY.city, tableX.city) city
FROM (SELECT * FROM tableX) x
LEFT OUTER JOIN tableY ON tableY.user_id=1
LEFT OUTER JOIN tableX ON tableX.id=1

这给了我错误:1248 每个派生的 table 必须有自己的别名。 但是找到解决方案我忘记了 FROM (SELECT)

中的 x

更改后它起作用了,但是结果是两行,所以我需要稍微更改一下。

Tnx @kickstarter

主要假设这是 return 单行,然后可能有一个子查询来生成单行,然后将其他 2 个表左连接到该行。

然后您可以使用大量 IF 语句来决定哪些表值 return。

效率应该不是它的强项吧!

SELECT IF(tableY.user_id IS NULL, tableX.id, tableY.user_id) AS id
    IF(tableY.user_id IS NULL, tableX.field2, tableY.other_field2) AS field2,
    etc
FROM (SELECT 1 AS dummy) a
LEFT OUTER JOIN tableY ON tableY.user_id = 1
LEFT OUTER JOIN tableX ON tableX.id = 1