473,418 Members | 2,074 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,418 software developers and data experts.

Stupid Query-thinking?

Hi there,

I'm building a website about animals.
There is a mySQL DB behind it.
There are 2 tables: 1 - species
2 - animals

Species could be: birds, fishes etc.
Animals would be: hawk, eagle etc, and orca, whale etc.
So every animal belongs to one of the species.

Anyway, there is an admin part to delete or edit animals or entire
species.

You get an overview of all the species, and behin it is a number of
how much animals there are in it.

I calculated them as following:

(Query to get species){
$species_name=$query['name'];
$count_animals = mysql_query("SELECT COUNT(*) FROM animals WHERE
sort_of_species=$species_name");
$total_animals_in_species = mysql_result($count_total_items, 0);
echo $species_name." amount=".$total_animals_in_species;
}

To make a long story short, for each positive result in the
"get-species-query" i run another one to count the animals inside.

is this heavy for the server/DB, is there a better way to do this?

Sorry for the long story, i hope it's clear...

Thanks in advance.

greetings knoakske
Jul 17 '05 #1
4 1576
knoak wrote:
Hi there,

I'm building a website about animals.
There is a mySQL DB behind it.
There are 2 tables: 1 - species
2 - animals

Species could be: birds, fishes etc.
Animals would be: hawk, eagle etc, and orca, whale etc.
So every animal belongs to one of the species.

Anyway, there is an admin part to delete or edit animals or entire
species.

You get an overview of all the species, and behin it is a number of
how much animals there are in it.

I calculated them as following:

(Query to get species){
$species_name=$query['name'];
$count_animals = mysql_query("SELECT COUNT(*) FROM animals WHERE
sort_of_species=$species_name");
$total_animals_in_species = mysql_result($count_total_items, 0);
echo $species_name." amount=".$total_animals_in_species;
}

To make a long story short, for each positive result in the
"get-species-query" i run another one to count the animals inside.

is this heavy for the server/DB, is there a better way to do this?
sort_of_species should be an index. (Probably using a numeric ID is
faster than a varchar).
Sorry for the long story, i hope it's clear...


MySQL? Use explain your query here

read documentation on explain.

--
John MexIT: http://johnbokma.com/mexit/
personal page: http://johnbokma.com/
Experienced programmer available: http://castleamber.com/
Happy Customers: http://castleamber.com/testimonials.html
Jul 17 '05 #2
knoak wrote:
Hi there,

I'm building a website about animals.
There is a mySQL DB behind it.
There are 2 tables: 1 - species
2 - animals

Species could be: birds, fishes etc.
Animals would be: hawk, eagle etc, and orca, whale etc.
So every animal belongs to one of the species.

Anyway, there is an admin part to delete or edit animals or entire
species.

You get an overview of all the species, and behin it is a number of
how much animals there are in it.


assuming the following tables in the db:

mysql> select * from species;
+------------+---------+
| species_id | species |
+------------+---------+
| 1 | birds |
| 2 | fishes |
+------------+---------+

mysql> select * from animal;
+-----------+--------+------------+
| animal_id | animal | species_id |
+-----------+--------+------------+
| 1 | hawk | 1 |
| 2 | eagle | 1 |
| 3 | orca | 2 |
| 4 | whale | 2 |
+-----------+--------+------------+
You can get your numbers in one pass with this query:

mysql> select species, count(animal.species_id) as 'number of animals'
from species, animal where species.species_id=animal.species_id group by
species;
+---------+-------------------+
| species | number of animals |
+---------+-------------------+
| birds | 2 |
| fishes | 2 |
+---------+-------------------+

HTH,
JP

--
Sorry, <de*****@cauce.org> is a spam trap.
Real e-mail address unavailable. 5000+ spams per month.
Jul 17 '05 #3
knoak wrote:
I'm building a website about animals.
There is a mySQL DB behind it.
There are 2 tables: 1 - species
2 - animals

Species could be: birds, fishes etc.
Animals would be: hawk, eagle etc, and orca, whale etc.
SCNR ... orca and whale are fish? :-)
So every animal belongs to one of the species.

Anyway, there is an admin part to delete or edit animals or entire
species.

You get an overview of all the species, and behin it is a number of
how much animals there are in it.
It all depends on how your tables are defined.

With these definitions:

mysql> desc species;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| name | varchar(20) | | | | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> desc animal;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| name | varchar(20) | | | | |
| species_id | int(11) | | | | |
+------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

I'd first get only the species' names and how many animals each has:

mysql> select s.name, count(a.id)
-> from species s left join animal a on a.species_id=s.id
-> group by s.name;
+--------+-------------+
| name | count(a.id) |
+--------+-------------+
| bird | 2 |
| fish | 0 |
| mammal | 2 |
+--------+-------------+
3 rows in set (0.00 sec)

and show that on the first selection. When the admin selects a species,
get its animals:

mysql> select a.name
-> from animal a, species s
-> where species_id=s.id
-> and s.name='mammal'; -- or s.id=3
+-------+
| name |
+-------+
| orca |
| whale |
+-------+
2 rows in set (0.00 sec)

is this heavy for the server/DB, is there a better way to do this?


As much as possible each query should ask exactly what you want and no
more. Always try to do a maximum of one single mysql_query() call per
php page.

Page 1: species -> get the species' names and number of animals in *one*
query

Page 2: animals from a species (passed in $_GET array) -> get just the
animals from the specified species.

--
Mail to my "From:" address is readable by all at http://www.dodgeit.com/
== ** ## !! ------------------------------------------------ !! ## ** ==
TEXT-ONLY mail to the whole "Reply-To:" address ("My Name" <my@address>)
may bypass my spam filter. If it does, I may reply from another address!
Jul 17 '05 #4
Hi knoak,

This question gets only interesting if species contains a hierachy,
like:
animals
birds
birds of pray
hawks
eagles
fishes
mamals
sea mamals
orca's
whales

The hierarchy uses a recursive foreign key equal to the key of the more
generic species group (which is in the same table as the more specific
ones).

Suppose the system is used by a field biologist, there may be another
table holding the numbers of the rings and tags, together with some
descriptive data like date of tagging, gender, coloring, size etc., and
of course a foreign key equal to the key of the most exact species the
tagged animal belongs to. Now we want to know the number of a higer
species group (for example birds) that where tagged after a certain
date. The code should work for a hierarchy of species of arbitrary depth
and any species (group). You can use any combination of SQL and php
code, but it should still perform reasonbly on a single processor off
the shelve server for about 10.000 species in an up to 10 deep
hierarchy. You can add some recursion into the data structure, but not
store the total number of tags per species group in the database.

Have fun!
Henk Verhoeven,
MetaClass.
knoak wrote:
Hi there,

I'm building a website about animals.
There is a mySQL DB behind it.
There are 2 tables: 1 - species
2 - animals

Species could be: birds, fishes etc.
Animals would be: hawk, eagle etc, and orca, whale etc.
So every animal belongs to one of the species.

Anyway, there is an admin part to delete or edit animals or entire
species.

You get an overview of all the species, and behin it is a number of
how much animals there are in it.

I calculated them as following:

(Query to get species){
$species_name=$query['name'];
$count_animals = mysql_query("SELECT COUNT(*) FROM animals WHERE
sort_of_species=$species_name");
$total_animals_in_species = mysql_result($count_total_items, 0);
echo $species_name." amount=".$total_animals_in_species;
}

To make a long story short, for each positive result in the
"get-species-query" i run another one to count the animals inside.

is this heavy for the server/DB, is there a better way to do this?

Sorry for the long story, i hope it's clear...

Thanks in advance.

greetings knoakske

Jul 17 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: TKD Karen | last post by:
I wrote this function (below) that is called 3 times; one for each case scenario. But the function only works for the Unresolved, not for the other 2 cases. There doesn't seem to be anything...
16
by: Justin Hoffman | last post by:
This is a question concerning query optimisation. Sorry if it's a bit long, but thanks to anyone who has the patience to help - This is my first post here... If I have two tables:...
9
by: noone | last post by:
I have a database file that I use an autonumber field as the primary key index. Because of some rearrangements in the past, this index does not match the order that I would like it to be in, that...
4
by: Steven Steyaert | last post by:
I hided a Query (via properties), how to unhide?? Is there another simple way to protect a query so that nobody can run it? Thx in advance Steven
2
by: Lampa Dario | last post by:
Hi, where is this stupid error in this program? When I execute it, i receive a segmentation fault error. #include <stdio.h> int main(int argc, char *argv, char *env) { int i=0; int l=0; int...
2
by: Justin Rich | last post by:
i have my form (default.aspx) and then my logic (default.aspx.cs) and when the logic is done, i want it to go to another page to display the results (results.aspx)... i dont really want to have...
3
by: MadCrazyNewbie | last post by:
Hey Group, Probably a Stupid question i know but, what is the difference between a datagrid and Dataview? Ta MCN
4
by: JimmyHoffa | last post by:
Hi hoping someone might be able to help with this issue, The following query is one i'd love to be able to use, but cant... select nodeid,max(datetimestamp) as datetimestamp,latitude,longitude...
1
keyvanrahmadi
by: keyvanrahmadi | last post by:
I have created a form which is as Follow: <form action="fleet-of-car.php" method="post"> <br />SELECT A FORM TO SEE : <select name="FORM"> <option value="ALL CARS"/>All Cars <Option...
0
by: webandwe | last post by:
Hi, When I press sign(submit) - It looks like something is wrong and the code does not want to insert the info into my SQL...I get the error message "could not query.." that I type in under...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.