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