2015-03-31 55 views
0

在一個查詢中我想從表X中選擇信息。 但是如果表X沒有返回任何信息,我想從表中檢索數據Y.MySQL:如果表X中的select爲空,請在表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,這當然是不同的。

也許任何人都有一個想法如何創建一個查詢,做我想做的事嗎?

EDITS: 下面是表說明:

的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(選擇)的x

改變它後,它工作,產生兩行,但我需要改變這一點。

TNX @kickstarter

+2

你能舉一些例子來說明你希望數據在一張表中不存在,但在另一張表中存在的例子嗎?這將有助於其他人重建問題並更好地理解問題。 – AdamMc331 2015-03-31 15:46:34

+1

這是爲了帶回單行,還是每個表包含多行的值? – Kickstart 2015-03-31 15:49:42

+0

Tnx這兩個響應。 @ McAdam331查看我對錶格的編輯 – BonifatiusK 2015-03-31 16:01:46

回答

1

作出了重大的假設,這是返回單行,然後可能有一個子查詢,生成一個行,然後LEFT OUTER JOIN另2臺到該行。

然後您可以使用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 
+0

好的,謝謝這是給我新的想法,這可能只是訣竅的確。 – BonifatiusK 2015-03-31 16:08:44

+0

它現在在我的第一個表示「缺少左括號」。所以我嘗試使用IFNULL,我編輯我的帖子上面,看看它做什麼,但也給出了一個錯誤...看到帖子@Kickstart – BonifatiusK 2015-03-31 16:23:37

+0

你不想使用IFNULL,因爲你要每次檢查相同的列這是關鍵不能真的是NULL)。否則,如果一個表上的列包含NULL,則會得到一個混淆的值。在你的SQL中,你需要給子查詢一個別名,而且它也只想返回一行(即在我的它只返回一行,其中一列包含值1)。 – Kickstart 2015-03-31 16:48:23

相關問題