WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQL: Hur selecta när en lista med id:n är given (https://www.wn.se/forum/showthread.php?t=23897)

swan 2007-09-28 11:19

Givet är en sorterad lista med produkt id:n (2343, 4352, 6543, 3245). Nu vill jag på ett snabbt sätt få fram produktnamnet för dessa id:n från en mysql databas. resultatet skall vara sorterat på samma sätt som i ursprungslistan. id är primärnyckel (och har därmed ett unikt index).

Vilket är snabbast?

1) loopa igenom listan och göra en select för varje produkt. dvs fyra (4) selects, en för varje produkt.
Exempel: "SELECT ID, TITLE FROM PRODUCTS WHERE ID = 3243"

2) en (1) select där (id = 2343 OR id = 4352 OR id = 6543 OR id = 3245)
Exempel: "SELECT ID, TITLE FROM PRODUCTS WHERE (ID = 2343 OR ID = 4352 OR ID = 6543 OR ID = 3245)"

3) annat?

Det som är viktigt är alltså att det går så snabbt som möjligt och att listan är sorterad enligt ursprungslistan.

Frej 2007-09-28 13:56

Kod:

SELECT ID, Title FROM Products WHERE ID IN (2343,4352,6543,3245)

swan 2007-09-28 14:00

Tack! Det skall jag prova!

Får man resultetet i "rätt" ordning?

Frej 2007-09-28 14:12

Beror på vilken ordning du vill ha!

Du kan ju använda dig av en Order BY värde.

Eller om du inte använder det så Har du antagligen ett fysiskt index på tabellen och då är ordningen på de fysiska datasidorna redan fastställda.

fors 2007-09-28 16:45

Var kommer listan med id-nummer från? Om listan kommer från databasen så kan du ju använda en subquery istället för att skriva statiska värden.

swan 2007-09-28 19:42

Listan kommer från användaren så jag kan inte använda mig av order by. Men om IN inte returnerar i samma värde så får jag väl försöka lösa det på något annat sätt.

WizKid 2007-09-28 19:52

Varför skulle du inte kunna använda ORDER BY bara för att listan kommer från användaren?
Kod:

SELECT ID, Title
FROM Products
WHERE ID IN (2343,4352,6543,3245)
ORDER BY ID


swan 2007-09-28 20:14

jo - jag vill alltså att den ursprungliga sorteringen skall finnas kvar. sorterar jag på ID så får jag 2343,3245,4352,6543 - dvs fel ordning.

WizKid 2007-09-28 20:21

Då missuppfattade jag dig. Antagligen gör du det lättast i php eller vilket språk du nu använder.

swan 2007-09-28 20:29

Så det snabbaste sättet är alltså att göra
Citat:

SELECT ID, Title FROM Products WHERE ID IN (2343,4352,6543,3245)
för att sedan sortera om resultatet i php (eller motsvarande)?

andi 2007-09-28 21:43

Kan detta funka?


SELECT ID, Title, FIND_IN_SET(id, '2343, 4352, 6543, 3245') as sort_column
FROM products
ORDER BY sort_column

swan 2007-10-01 12:15

Citat:

Originally posted by andi@Sep 28 2007, 21:43
Kan detta funka?


SELECT ID, Title, FIND_IN_SET(id, '2343, 4352, 6543, 3245') as sort_column
FROM products
ORDER BY sort_column

Efter lite modifiering fick jag det att fungera. Det är viktigt att det inte är mellanslag i FIND_IN_SET.

SELECT ID, TITLE, FIND_IN_SET(ID, '2343,4352,6543,3245') as sort_column
FROM PRODUCTS
WHERE ID IN ('2343','4352','6543','3245')
ORDER BY sort_column

Frågan gick ganska snabbt att exekvera, men när jag körde EXPLAIN så står det "Using where; Using filesort". Tar jag bort FIND_IN_SET så försvinner "using filesort". Din lösning är annars väldigt bra - men jag hade helst sett att den inte använder filesort då det slöar ner frågan...

andi 2007-10-01 15:10

Citat:

Efter lite modifiering fick jag det att fungera. Det är viktigt att det inte är mellanslag i FIND_IN_SET.

SELECT ID, TITLE, FIND_IN_SET(ID, '2343,4352,6543,3245') as sort_column
FROM PRODUCTS
WHERE ID IN ('2343','4352','6543','3245')
ORDER BY sort_column


Fast behöver du den tredje raden? Kanske kan man kolla värdet av fältet sort_column, typ: "WHERE sort_column is not null" eller vad värdet nu blir på de rader som inte har sitt ID i ditt "SET"

swan 2007-10-01 15:14

Utan den tredje raden så måste mysql gå igenom alla kolumner i hela tabellen, det tar väldigt lång tid.

Som jag förstår det är den tredje raden väldigt bra. den gör att det går väldigt snabbt och använder sig dessutom av index.

det som gör att det går långsamt är FIND_IN_SET eftersom den måste använda sig av filsortering.


Alla tider är GMT +2. Klockan är nu 14:54.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson