在一个查询中我想从表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
答案 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