Home > Net >  how to filter a table with where
how to filter a table with where

Time:12-14

I'm trying to filter my table 'mange' with the condition of customers who eat both the "mexicaine" and the "végétarienne".

I have a table 'mange' which contains 'nom' and 'pizza'

I have tried to filter with

select *
from mange
where ( pizza = 'végétarienne')
and ( pizza = 'mexicaine')

But I don't get anything even though I have some 'nom' who eat both.

CodePudding user response:

SELECT nom, count(distinct pizza) as DistinctpizzaCNt
FROM mange
WHERE ( pizza in 'végétarienne', 'mexicaine')
GROUP BY nom
having count(distinct pizza) = 2 

or use set based logic

SELECT nom
FROM mange
WHERE ( pizza = 'végétarienne')

INTERSECT

SELECT nom
from Mannge
WHERE ( pizza = 'mexicaine')

CodePudding user response:

A WHERE clause is a Boolean expression that each row is tested against. Only if a row returns TRUE for the whole expression does the row get returned.

So, a 'végétarienne' row would be tested by your WHERE clause and yield TRUE AND FALSE, which according to Boolean logic yields FALSE.

Similarly, a 'mexicaine' row would be tested by your WHERE clause and yield FALSE AND TRUE, which according to Boolean logic also yields FALSE.

Note: Because no individual row is ever both 'végétarienne' AND 'mexicaine', no row will ever be returned by your WHERE clause.


You could either use OR, or use IN(). I'd recommend the latter...

select *
  from mange
 where ( pizza = 'végétarienne')
    or ( pizza = 'mexicaine')

Or...

select *
  from mange
 where pizza IN ('végétarienne', 'mexicaine')

CodePudding user response:

The reason why you don't get anything is because you're trying to evaluate pizza = 'végétarienne' and pizza = 'mexicaine' at the same time. When a pizza is both vegetarian and mexicane? Never.

That's why you would require the OR condition here, to make sure either one of them is retrieved:

SELECT * 
FROM mange 
WHERE (pizza = 'végétarienne') OR (pizza = 'mexicaine')

In this case you'd retrieve people that eat either one of them, or both. If you want to restrict it to the people that like both and not only one, then you can look for people that like vegetarian, people that like mexicaine and intersect the two sets using the INTERSECT operation as follows:

SELECT * FROM mange WHERE pizza = 'végétarienne'
INTERSECT 
SELECT * FROM mange WHERE pizza = 'mexicaine'

CodePudding user response:

Your goal is not 100% clear to me. My first impression was you are just looking for an IN clause to fetch both pizzas, 'végétarienne' and 'mexicaine':

SELECT *
FROM mange
WHERE pizza IN ('végétarienne','mexicaine');

An IN clause will fetch all entries having one of its values. Since a pizza can't be "végétarienne" and "mexicaine" the same time, we can't build this up using AND, but need an IN clause or OR.

But at second glance, paying attention to your requirement to show the customers who eat both the "mexicaine" and the "végétarienne", this would be an incorrect approach because it would also list such customers who eat only one of them.

So if you are only looking for those customers who eat both pizzas, this can be done this way, using two IN clauses:

SELECT *
FROM mange
WHERE nom
IN
(SELECT nom
FROM mange
WHERE pizza = 'végétarienne')
AND nom 
IN 
(SELECT nom
FROM mange
WHERE pizza = 'mexicaine');

CodePudding user response:

jonas metlezer , citron, MatBailie my question was not clear because my English is not good but thank you all. The double clause IN AND IN I was able to solve the problem. Thank you very much.

  • Related