|
| MySQL query optimering Fra : Morten |
Dato : 20-10-07 19:55 |
|
Hej. Jeg har en MySQL query som jeg tror kan gøres bedre. Min data model:
CREATE TABLE man (id INTEGER, name VARCHAR(64));
CREATE TABLE car (id INTEGER, owner_id INTEGER, make VARCHAR(64));
En mand kan altså have flere biler. Jeg vil nu gerne udtrække alle
bilmærker for en enkelt mand i en enkelt record, så givet flg. data:
INSERT INTO man VALUES (1, 'John');
INSERT INTO car VALUES (1, 1, 'Mazda');
INSERT INTO car VALUES (2, 1, 'Ford');
INSERT INTO car VALUES (3, 1, 'Toyota');
Skal resultatet være "John", "Mazda, Ford, Toyota". Det kan jeg gøre
således:
SELECT man.name, virtual_cars.makes
FROM man, (SELECT owner_id, GROUP_CONCAT(car.make) AS makes
FROM car GROUP BY owner_id) AS virtual_cars
WHERE man.id = virtual_cars.owner_id
Mit spørgsmål er nu, kan det gøres bedre? Fex. hvis man kunne angive
man.id allerede i det virtuelle view "virtual_cars", så er det vel
bedre? Eller kan query optimizeren godt regne den ud?
Morten
| |
Michael Zedeler (21-10-2007)
| Kommentar Fra : Michael Zedeler |
Dato : 21-10-07 10:31 |
|
Morten wrote:
>
> Hej. Jeg har en MySQL query som jeg tror kan gøres bedre. Min data model:
>
> CREATE TABLE man (id INTEGER, name VARCHAR(64));
> CREATE TABLE car (id INTEGER, owner_id INTEGER, make VARCHAR(64));
>
> En mand kan altså have flere biler. Jeg vil nu gerne udtrække alle
> bilmærker for en enkelt mand i en enkelt record, så givet flg. data:
>
> INSERT INTO man VALUES (1, 'John');
> INSERT INTO car VALUES (1, 1, 'Mazda');
> INSERT INTO car VALUES (2, 1, 'Ford');
> INSERT INTO car VALUES (3, 1, 'Toyota');
>
> Skal resultatet være "John", "Mazda, Ford, Toyota". Det kan jeg gøre
> således:
>
> SELECT man.name, virtual_cars.makes
> FROM man, (SELECT owner_id, GROUP_CONCAT(car.make) AS makes
> FROM car GROUP BY owner_id) AS virtual_cars
> WHERE man.id = virtual_cars.owner_id
>
> Mit spørgsmål er nu, kan det gøres bedre? Fex. hvis man kunne angive
> man.id allerede i det virtuelle view "virtual_cars", så er det vel
> bedre? Eller kan query optimizeren godt regne den ud?
Måske
SELECT owner_id, name, GROUP_CONCAT(make)
FROM man, car
WHERE man.id = car.owner_id
GROUP BY owner_id, name
Mvh. Michael.
| |
|
|