Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: MySQL + GROUP BY?

mrkebab [27.05.2008 13:56:05]

#

Terve.

SQL-taito ei riitä seuraavanlaiseen kyselyyn. Kysely on luullakseni aika simppeli, mutta ei vain osaa.
Minulla on siis 3 taulua seuraavasti:

REITTI-TAULU:

+----+----------------------+
| id | reittiosa            |
+----+----------------------+
|  1 | F13:224/&TTY&TTS&TTR |
|  2 | E18:140/KEK&KEK&KEK  |
|  3 | E18:140/RTT&RTT&KEK  |
+----+----------------------+

OSA-TAULU:

+-----+------------------+----------------------+--------+-----------------+
| id  | osa              | reitti_nt            | ajo_id | reitti_taulu_id |
+-----+------------------+----------------------+--------+-----------------+
|   1 | reitti_123000_10 | X130                 |      1 |               2 |
|   2 | reitti_123000_10 | X131                 |      1 |               2 |
|   3 | reitti_123000_10 | X132                 |      1 |               2 |
|   4 | reitti_123000_10 | X133                 |      1 |               3 |
|   5 | reitti_123000_10 | X134                 |      1 |               3 |
| 100 | reitti_123000_10 | X130                 |      2 |               2 |
| 101 | reitti_123000_10 | X131                 |      2 |               2 |
| 102 | reitti_123000_10 | X132                 |      2 |               2 |
| 103 | reitti_123000_10 | X133                 |      2 |               3 |
| 104 | reitti_123000_10 | X134                 |      2 |               3 |
| 230 | xxx_0            | AAR4                 |      1 |               1 |
| 231 | xxx_0            | AAR4                 |      1 |               1 |
+-----+------------------+----------------------+--------+-----------------+

AIKA-TAULU:

+-------+-------+-------------+
| aika1 | aika2 |osa_taulu_id |
+-------+-------+-------------+
| 4     | 3     |           1 |
| 7     | 3     |           2 |
| 5     | 2     |           3 |
| 9     | 8     |           4 |
| 2     | 9     |           5 |
| 7     | 1     |         100 |
| 2     | 2     |         101 |
| 0     | 1     |         102 |
| 6     | 2     |         103 |
| 2     | 3     |         104 |
| 3     | 1     |         230 |
| 4     | 3     |         231 |
+-------+-------+-------------+

Nyt yritän seuraavaa:

Kun jokin tietty reittiosa-valitaan, esimerkiksi E18:140/KEK&KEK&KEK, niin sillä on tietysti uniikki id, eli tässä tapauksessa = 2

Nyt haen OSA-taulusta kaikki tietueet, joilla on reitti_taulu_id=2 eli saadaan nämä tietueet:

+-----+------------------+----------------------+--------+-----------------+
| id  | osa              | reitti_nt            | ajo_id | reitti_taulu_id |
+-----+------------------+----------------------+--------+-----------------+
|   1 | reitti_123000_10 | X130                 |      1 |               2 |
|   2 | reitti_123000_10 | X131                 |      1 |               2 |
|   3 | reitti_123000_10 | X132                 |      1 |               2 |
| 100 | reitti_123000_10 | X130                 |      2 |               2 |
| 101 | reitti_123000_10 | X131                 |      2 |               2 |
| 102 | reitti_123000_10 | X132                 |      2 |               2 |
+-----+------------------+----------------------+--------+-----------------+

Ja kun OSA-taulusta on haettu yllä olevat tiedot, niin jokaiselle OSA-taulun tietueelle löytyy aika1 ja aika2 AIKA-taulusta taas tuon uniikki id:n perusteella.

Esimerkiksi OSA-taulun tietueelle nro 1 löytyy AIKA-taulusta ajat: aika1=4 ja aika2=3.

+-------+-------+-------------+
| aika1 | aika2 |osa_taulu_id |
+-------+-------+-------------+
| 4     | 3     |           1 |
+-------+-------+-------------+

KYSYMYS: Miten saan seuraavanlaisen kyselyn: Nyt kun on siis valittu tietty reittiosa, esim: E18:140/KEK&KEK&KEK, niin siihen kuuluvat tietueet haetaan OSA-taulusta:

+-----+------------------+----------------------+--------+-----------------+
| id  | osa              | reitti_nt            | ajo_id | reitti_taulu_id |
+-----+------------------+----------------------+--------+-----------------+
|   1 | reitti_123000_10 | X130                 |      1 |               2 |
|   2 | reitti_123000_10 | X131                 |      1 |               2 |
|   3 | reitti_123000_10 | X132                 |      1 |               2 |
| 100 | reitti_123000_10 | X130                 |      2 |               2 |
| 101 | reitti_123000_10 | X131                 |      2 |               2 |
| 102 | reitti_123000_10 | X132                 |      2 |               2 |
+-----+------------------+----------------------+--------+-----------------+

Niin nyt laskettaisiin AIKA-taulusta keskiarvo siten, että käytettäisiin ajo_id:tä hyväksi (GROUP BY ?)
Eli lasketaan aika1+aika2 jokaiselle tietueelle, missä on ajo_id=1 ja jaettaisiin kolmella.
Sama tehtäisiin tietusti niille tietuille joilla on ajo_id=2 jne...

Eli loppupelissä haluaisin vain tälläisen tuloksen:

+-------+----------+
|ajo_id |Keskiarvo |
+-------+----------+
|   1   |     8    |
+-------+----------+
|   2   |   4.33   |
+-------+----------+

Eli ajo_id 1:sen keskiarvo saataisiin: (4+3 + 7+3 + 5+2) / 3 = 8
ja ajo_id 2:sen keskiarvo näin: (7+1 + 2+2 + 0+1) / 3 = 4.333

Tiedän kyllä millaista tulosta pitäisi saada, mutta en omista SQL-tietämystä niin paljon, että saisin suoritettua
yo. haun.

Chiman [27.05.2008 15:21:45]

#

Menisiköhän näin?

SELECT
  o.ajo_id,
  AVG(a.aika1 + a.aika2) AS Keskiarvo
FROM
  OSA o,
  AIKA a
WHERE
  o.reitti_taulu_id = 2 AND
  o.id = a.osa_taulu_id
GROUP BY
  o.ajo_id
ORDER BY
  o.ajo_id ASC

mrkebab [27.05.2008 17:05:01]

#

Chiman.

Kiitos. Melkein toimii.
Nyt tulee vain yksi keskiarvo:

+--------+-----------+
| ajo_id | Keskiarvo |
+--------+-----------+
|      1 |    8.0000 |
+--------+-----------+
1 row in set (0.00 sec)

Kokeilen muokata kyselyä.

mrkebab [27.05.2008 22:40:02]

#

mrkebab kirjoitti:

Chiman.

Kiitos. Melkein toimii.

Otetaan sen verran takaisin, että toimii täydellisesti.
Itse hölmöilin.

Kiitos paljon Chiman !!!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta