How to select unique rows from one to many relationed tables in MySQL?
As MySQL-Noob I am struggeling to solve the fol开发者_Go百科lowing task: Assuming 3 tables: location
groceries
and person
with the following properties:
- Every table has a primary autoincremented integer id and a varchar column.
- The entrys in the tables are all unique.
- Every entry in
groceries
has a foreign key of an entry inperson
. - It is possible that more then one entry from
groceries
share the same foreign key. - (3) and (4) apply to
person
andlocation
, too
So we have a many to one to many relation. How can I select every triple (groceries_product, person_name, location_name)
where person_name
does not occur more then once?
Example:
tables: groceries | person | location
------------------------------------ ------------- -------------------------
columns: id product person_id | id name | id name person_id
------------------------------------ ------------- -------------------------
1 hamburger 1 | 1 Peter | 1 home 1
2 cheeseburger 1 | 2 Tom | 2 work 1
3 carot 1 | | 3 zoo 2
4 potatoe 1 | |
5 mango 2 | |
All the triples you can create in which Peter
occures are irrelevant. I want only triples like (mango, Tom, zoo), because Tom does occure only once in all possibilities. I hope my question ist understandable. :-)
I think you have to do a subselect to get your result:
SELECT groceries.product, person.name, location.name
FROM person
LEFT JOIN groceries ON person.id = groceries.person_id
LEFT JOIN location ON person.id = location.person_id
WHERE person.id
IN (
SELECT person.id
FROM person
LEFT JOIN groceries ON person.id = groceries.person_id
LEFT JOIN location ON person.id = location.person_id
GROUP BY person.id
HAVING count( person.id ) =1
)
select l.name, m.name, r.name
from `left` l
left join middle m on m.id = l.middle_id
left join `right` r on m.id = r.middle_id;
精彩评论