/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste