Reputation: 45
I have a question regarding SQL syntax and how my query should be done.
I have atm conquered my problem using two queries and some PHP. However, let me present my DB and problem.
With the unique ID of the print table i want to be able to get:
The query is quite simple when it comes to collecting all the values
SELECT pr.dex,
pr.image,
p.name,
r.rarity,
t.type,
t2.type,
t3.type,
p1.name,
p2.name,
p3.name,
p4.name
FROM prints pr
JOIN pokemons p ON p.dex=pr.dex
JOIN rarities r ON r.id=pr.rarity
JOIN types t ON t.id=p.type
JOIN types t2 ON t2.id=pr.weakness
JOIN types t3 ON t3.id=pr.resistance
JOIN pokemons p1 ON p1.dex=p.evolveto
JOIN pokemons p2 ON p2.dex=p.evolveto2
JOIN pokemons p3 ON p3.dex=p.evolveto3
JOIN pokemons p4 ON p4.dex=p.evolvefrom
WHERE pr.id=2;
But for some pr.id(s)
the values for pr.weakness
, pr.resistance
, p.evolveto
, p.evolveto2
, p.evolveto3
or p.evolvefrom
can and should be null.
When any of them are null the query comes back empty.
So basically what I want is to exclude values which are null.
I've tried to wrap in some selects with COALESCE()
and played around a bit with CASE
but without success. It would be awesome if it can be done with only one query regardless of what value pr.id
has.
Upvotes: 0
Views: 1502
Reputation: 20435
Your INNER JOINs feature ON clauses that do equijoin on a possibly NULL field. Yet you want to get a row back anyway, showing that the given field was empty.
The tool you're looking for is LEFT OUTER JOIN, which will do exactly that. https://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join
For example
SELECT cat.name, cat.price, inv.qty, inv.date
FROM catalog cat
LEFT OUTER JOIN inventory inv ON cat.id = inv.cat_id
will reveal catalog items even if they've not been inventoried.
An expression like COALESCE(inv.qty, 0)
can be handy for suppressing NULLs
in the result rows, if desired.
Upvotes: 1