MySQL:如果表X中的select为空,请在表Y中选择

时间:2015-03-31 15:39:46

标签: mysql sql database mysql-workbench

在一个查询中我想从表X中选择信息。 但是,如果表X没有返回任何我想从表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)

Bot版本只会执行第一个查询,但不会执行第二个查询。 所以我有点卡在这里。

我也尝试了这个,但由于这些表没有相同的行,所以这不应该有用......而且这样做无法正常工作:

     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,这当然是变化的。

也许有人知道如何创建一个符合我想要的查询?

编辑:   以下是表格说明:

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每个派生表必须有自己的别名。 但是找到了解决方案,我在FROM(SELECT)

中忘记了x

更改后它工作,然后导致两行,所以我需要稍微改变一下。

Tnx @kickstarter

1 个答案:

答案 0 :(得分:1)

主要假设这是返回一行,然后可能有一个子查询生成一行,然后LEFT OUTER JOIN其他两个表到该行。

然后,您可以使用一组IF语句来决定返回哪些表值。

效率不太可能是它的强项!

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