How to rewrite subquery to return only 1 row
Frage
I need to somehow check if query result is NULL
, MySQL returns error Subquery returns more than 1 row
. How should I rewrite it in order to work correctly please?
SELECT DISTINCT user.id, user.username, user.name, user.surname, user.avatar,
(SELECT IF(ISNULL(
(SELECT attendant.fk_user AS u
FROM attendant
WHERE fk_event = 1
UNION
SELECT organizer.fk_user AS u
FROM organizer
WHERE fk_event = 1
UNION
SELECT invitation.fk_user_to AS u
FROM invitation
WHERE fk_event = 1)), NULL, 1)) AS related
...
Lösung 3
I've solved it after few hours of trying and googling. This post on stackoverflow was helpful. Instead of IF
and ISNULL
there should be used CASE WHEN EXISTS
like this:
SELECT DISTINCT user.id, user.username, user.name, user.surname, user.avatar,
CASE WHEN EXISTS
(SELECT attendant.fk_user AS u
FROM attendant
WHERE fk_event = 1
AND fk_user = `user`.id
UNION
SELECT organizer.fk_user AS u
FROM organizer
WHERE fk_event = 1
AND fk_user = `user`.id
UNION
SELECT invitation.fk_user_to AS u
FROM invitation
WHERE fk_event = 1
AND fk_user_to = `user`.id) THEN 1 ELSE 0 END AS related
...
Andere Tipps
Change your subquery select to count(*) e.g.
select o.OrderID, o.OrderAmount
from Orders o
where (select count(id) from Disputes d where d.CustomerID = o.CustomerID) <= 0
Or a little bit simpler is to use "WHERE EXISTS".
SELECT DISTINCT store_type FROM stores
WHERE EXISTS (SELECT * FROM cities_stores
WHERE cities_stores.store_type = stores.store_type);
For details see: https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html
And for the subqueries use
FROM ( subquery1 union subqueryN) AS related
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange