webForumDet fria alternativet

Tips på lösning av SQL-fråga. Ännu friare än LIKE/wildcards

Databaser & SQL

3 svar · 338 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej!

Jag har en tabell med massa nummer med längder från 1 till 5 siffror i fälttypen varchar(5). Jag vill med hjälp av detta kunna hämta ut det nummer som bäst stämmer överens med ett 5-siffrigt variabelvärde.

Om t ex följande nummer finns i databasen:

A) 0
B) 12
C) 123
D) 1234
E) 12345

... och jämförelsevariabeln är t ex 12346 så ska raden D) 1234 hämtas, då den har flest siffror som stämmer överens med variablen, räknat från vänster. Bara rader där alla siffror matchar variablen ska hämtas, därav inte E) som slutar på 5. Om ingen siffra matchar från vänster så ska en rad med 0 hämtas, A).

Det kanske är lite svårt att förstå vad jag menar, men jag radar upp lite scenarion så kanske det klarnar:

Om $v =
91000 -> hämta A)
12900 -> hämta B)
12355 -> hämta C)
12346 -> hämta D)
12345 -> hämta E)

Just nu ser min kod ut så här:

SELECT * FROM t_nummer WHERE k_nummer LIKE '" . $v_nummer .  "%' ORDER BY k_nummer ASC LIMIT 0,1

Men kruxet är ju att den då inte hämtar något alls på mina första 4 scenarion ovan.

Om någon orkar ta sig an utmaningen så vore jag enormt tacksam, för jag står still och stampar och vet bara hur jag vill ha det, men har inte en susning om hur jag ska få till det. Om det ens är möjligt med så många "om" ;) Men det borde gå :D

Taxi!

Medlem sedan juli 200012 978 inlägg
#2

En tvåstegslösningen kanske är att föredra Om det är statiska värden kan man bygga andra delen på en gång. dvs ordn grupperna så att man får träff på rätt ingåmgsvärde.

Medlem sedan nov. 20016 480 inlägg
#3

Hur menar du? :)

Skulle det här funka?:

 WHERE k_nummer = '" . $v_nummer .  "' OR k_nummer LIKE '" . substr($v_nummer,0,4) .  "%' OR k_nummer LIKE '" . substr($v_nummer,0,3) .  "%' OR k_nummer LIKE '" . substr($v_nummer,0,2) .  "%'OR k_nummer LIKE '" . substr($v_nummer,0,1) .  "%'

Men det känns lite fult. Jag kom på det precis så jag vet inte ens om det funkar som jag har tänkt, men det borde det göra och om man inte får något resultat så kan man anta att det ska returneras 0.

Om det mot förmodan är den bästa lösningen, hur påfrestande är det att köra en sådan funktion om man har många nummer i databasen?

Medlem sedan juli 20033 147 inlägg
#4
$sql = "SELECT * FROM t_nummer WHERE k_nummer LIKE '" . substr($v_nummer,0,1) . "%'";

for ($i = 2; $i <= (strlen($v_nummer)-1); $i++) {
   $sql .= " OR k_nummer LIKE '" . substr($v_nummer,0,$i) .  "%'";
}

$sql .= " ORDER BY k_nummer ASC LIMIT 0,1";

Helt otestat, men kanske något att bygga vidare på.

254 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)