Avatar billede nicklasb Nybegynder
20. februar 2008 - 09:23 Der er 6 kommentarer og
1 løsning

Beskrivelse på forskellige sprog

Jeg har forsøgt at skitsere mine tabeller nedenfor, med noget simplificeret testdata (- opsætningen bliver sikkert ødelagt, men jeg tror det er muligt at læse alligevel).

PRODUCT
-----------------
| id    | price    |
-----------------
| 1    | 100    |
| 2    | 50    |
| 3    | 90    |
-----------------

PRODUCT DESCRIPTION
-------------------------------------------------
| language    | product    | name        |
-------------------------------------------------
| 26    [tysk]    | 1        | Jacke        |
| 26        | 2        | Hose        |
| 26        | 3        | Schlips    |
| 32    [dansk]    | 1        | Trøje        |
| 32        | 2        | Bukser    |
| 38    [eng.]    | 1        | Cardigan    |
| 38        | 2        | Trousers    |
| 38        | 3        | Tie        |
-------------------------------------------------


Nu vil jeg gerne have alle mine produkter skrevet ud, hvad angår pris og navn. Jeg fortrækker at få beskrivelsen på dansk (32), men hvis ikke der findes en dansk beskrivelse, vil jeg gerne have den engelske (38) (eller vælge en anden (eksempelvis tysk; 26). Altså ønsker jeg at kunne opstille en liste over fortrukne sprog / rækkefølgen af sprog jeg ønsker beskrivelsen på.

Når jeg kører en LEFT JOIN, går det meget langsomt, når databasen indeholder mange produkter. Jeg ved ikke om det vil hjælpe på det, at undlade brugen af LEFT JOIN (?).

Jeg vil selvfølgelig kun have én række per produkt (altså kun ét navn og én pris).

Hvordan skal min SQL se ud, for at hente de ønskede informationer?
(Som beskrevet, er ovenstående en meget simplificeret udgave af tabellen - men jeg tror alt det nødvendige er med, til at kunne beskrive problemet,- hvis der mangler informationer, må I endeligt skrive.)
Avatar billede arne_v Ekspert
20. februar 2008 - 14:04 #1
Join. Og løs performance problemet med passende brug af index.
Avatar billede arne_v Ekspert
20. februar 2008 - 14:05 #2
Hvis du laver en tabel med to felter: language, prioritet kan du hente det der findes
med højeste prioritet.
Avatar billede nicklasb Nybegynder
20. februar 2008 - 15:51 #3
Prioriteringen af sprogene, er individuel for den enkelte bruger der skal bruge systemetet. Listen har jeg dog - så det er ikke her problemet ligger.

Jeg har forsøgt med med en forespørgsel;

SELECT *
FROM `base_product` p, `language_product` l
WHERE p.`product_id` = l.`product_id` AND l.`language_id` IN (
SELECT language_id
FROM `system_language`
WHERE `language_status` = 'active'
ORDER BY FIELD(language_id,38,32) ASC
)
GROUP BY p.`product_id`

Felterne hedder noget lidt andet, end i eksemplet ovenfor, men det burde være til at oversætte. Sætningen virker dog ikke helt korrekt, idet den ikke joiner tabellerne i forhold til den orden jeg har sat på language_id. Jeg ved ikke om du har en idé?
Avatar billede arne_v Ekspert
21. februar 2008 - 01:12 #4
Jeg tænker i retning af:

SELECT *
FROM product p JOIN language l1 ON p.product_id=l1.product_id
WHERE l1.prioritet = (SELECT MAX(z.prioritet) FROM language l2 JOIN prioritet z ON l2.language=z.language WHERE l2.product_id=l1.product_id)
Avatar billede arne_v Ekspert
06. april 2008 - 06:12 #5
kommet videre ?
Avatar billede nicklasb Nybegynder
13. juli 2008 - 12:00 #6
Ja, smid et svar..
Avatar billede arne_v Ekspert
13. juli 2008 - 14:59 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester