[ale] MySQL help
Jim Kinney
jim.kinney at gmail.com
Fri Mar 13 18:47:18 EDT 2015
Excellent answer.
+1!
On Mar 13, 2015 4:57 PM, "Alex Carver" <agcarver+ale at acarver.net> wrote:
> There are four JOINs available to you, LEFT, RIGHT, INNER (this one is
> usually just the unadorned JOIN keyword) and OUTER.
>
> To see if you have an animal with no food and given that your food table
> is on the right of the animal table in the query you offered you need to
> use a LEFT JOIN. The LEFT JOIN ensures that the left table takes
> precedence during row generation such that missing matches result in
> NULLs in the fields from the right-side tables:
>
> So change your query to:
>
> SELECT id, name, family, feed FROM animal LEFT JOIN food ON animal.id =
> food.animalid;
>
> That gives you everything. Then add a WHERE clause to filter out
> animals missing food:
>
> SELECT id, name, family, feed FROM animal LEFT JOIN food ON animal.id =
> food.animalid WHERE feed IS NULL;
>
> The unadorned JOIN (which is a INNER or STRAIGHT JOIN) will only show
> records where there are matches in all joined tables. The RIGHT JOIN
> variant will reverse the precedence of the tables (LEFT and RIGHT JOINs
> work the same, the precedence is reversed and it's mainly used when you
> join many tables so that you get the precedence correct for the needed
> query).
>
> On an aside, the table as constructed isn't quite proper according to
> the rules of Normal Form (how databases are laid out). Your food table
> should not have an animal ID. Instead your animal should have a food ID
> if it can only eat one type of food. Alternatively there should be a
> third table which maps animal ID to food ID that way an animal can eat
> more than one food.
>
> Two table variant:
> Animal: {id, name, family, weight, foodid}
> Food: {id, feed}
>
> Three table variant:
> Animal: {id, name, family, weight}
> Food: {id, feed}
> AnimalFoodMap: {animalid, foodid}
>
> In the three table variant you join the animal and food tables using the
> AnimalFoodMap as "glue":
>
> SELECT name, family, weight, feed FROM Animal LEFT JOIN AnimalFoodMap ON
> animal.id = AnimalFoodMap.animalid LEFT JOIN Food ON
> AnimalFoodMap.foodid = Food.id;
>
> If an animal has more than one food type, the animal is listed once in
> the Animal table, the foods are each listed only once in the Food table
> and the AnimalFoodMap table contains the appropriate pairings. Your
> example has more than one food per animal and also one repeated food so
> let's modify it:
>
> Animal (table):
> id name family weight
> 1 Seymore Snake 10
> 2 Gerard Giraffe 120
>
> Food (table):
> id feed
> 1 mice
> 2 leaves
> 3 grass
>
> Now the magic AnimalMapTable:
> animalid foodid
> 1 1
> 1 2
> 2 2
> 2 3
>
> (Note that I'm skipping over some things such as keys that should be
> used to ensure there are no duplicates)
>
> After doing this there are several additional ways to write up queries
> to make an output similar to what you have (single line for an animal
> plus all the entries for the foods) which requires some more complicated
> query structure. But for now, the query I wrote above would output:
>
> id name family feed
> 1 Seymore Snake mice
> 1 Seymore Snake leaves
> 2 Gerard Giraffe leaves
> 2 Gerard Giraffe grass
>
>
> On 2015-03-13 10:52, David S Jackson wrote:
> > Hi,
> >
> > I'm a MySQL newbie. I'm just starting to use Python to talk to MySQL
> > databases, but first I need to understand the MySQL query language!
> >
> >
> > So, I have two tables: (zoo) animal and food.
> >
> > animal has the columns ID, NAME, FAMILY, WEIGHT
> >
> > food has ID, ANIMALID, FEED
> >
> >
> > So if I go: select id, name, family, feed from animal JOIN food ON
> > animal.id=food.animalid;
> >
> >
> > I get something like:
> >
> > ID NAME FAMILY FEED
> > 1 Seymore Snake mice, leaves
> > 2 Gerard Giraffe leaves, grass
> > ...
> > etc
> >
> > So, if I have a situation where I want to see whether an animal has been
> > added the animal table but may have not been added to the food table,
> > how would I compose that query?
> >
> > That is, the animal could have been added to the animal table and could
> > get an id, say 10, but the food table could have 20 foods already
> > entered and the animal-id would be used several times.
> >
> > I was thinking, is there a way I can ask, "does the highest animal.id
> > number equal the highest food.animalid number"? If not, what animal is
> > not getting fed?
>
> _______________________________________________
> Ale mailing list
> Ale at ale.org
> http://mail.ale.org/mailman/listinfo/ale
> See JOBS, ANNOUNCE and SCHOOLS lists at
> http://mail.ale.org/mailman/listinfo
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.ale.org/pipermail/ale/attachments/20150313/3a7b65f3/attachment.html>
More information about the Ale
mailing list