webForumDet fria alternativet

SUBSTR problem

4 svar · 554 visningar · startad av startail

startailMedlem sedan sep. 2000159 inlägg
#1

Hej,

Jag försöker göra en lite mera avancerad query för MySQL.
Jag har ett värde i databasen som heter postalcode, och jag vill försöka ta ut alla värden i databasen som är inom ett kritera till på det resultat som jag får ut.

Tex, så kan man söka på postalcity = 'GÖTEBORG', det ger resultat postalcode = '41000'. Jag vill nu söka samtidigt på postalcode > '40%' AND postalcode < '42%'.

Kan man göra detta med SUBSTR()?
Tex något i stil med detta...

SELECT * FROM store WHERE postalcity = 'GÖTEBORG' OR 
(postalcode > 'SUBSTR(postalcode,0,2)-1%' AND postalcode < 'SUBSTR(postalcode,0,2)+1%')
ORDER BY postalcity ASC";

Jag är medveten om att -1 och +1 inte är korrekt, men finns det något sätt man kan göra detta på ett sådan sätt. Jag vill alltså komma undan att göra fler än en query.

nitro2k01Medlem sedan aug. 20037 630 inlägg
#2

Vilken datatyp är postalcode?
Är det en strängtyp av något slag så kan du använda LIKE uppenbarligen. Det kan funka på nummer också, men jag har inte tillgång till någon MySQL-databas just nu så jag kan inte bekräfta. (Du får visserligen flera uttryck som du får OR'a ihop, men det ryms ändå inom en fråga)

SELECT * FROM store 
WHERE 
    postalcity = 'GÖTEBORG' OR 
    postalcode LIKE '40%' OR
    postalcode LIKE '41%' OR
    postalcode LIKE '42%'
ORDER BY postalcity ASC";

Är det en INT kan du använda > och < för att ange undre och övre gränser. Notera parenteserna.

SELECT * FROM store 
WHERE 
    postalcity = 'Göteborg' OR 
    (postalcode > 40000 AND postalcode < 43000);
ORDER BY postalcity ASC";

Vill du byta typ kan du göra det genom att skapa en ny kolumn och kopiera över värdet. T ex sträng -> int. Skulle det skita sig kan du bara ta bort postalcode_i.

-- Skapa kolumnen
ALTER TABLE store ADD (postalcode_i INT);

-- Kopiera över värdena
UPDATE store SET postalcode_i = postalcode;
startailMedlem sedan sep. 2000159 inlägg
#3

Det värdet jag vill använda mig utav är värdet som man får från databasen och sedan söka på liknande resultat med postalcode +1 och -1. Altså jag har inget värde sedan tidigare jag kan skriva in.

Jag undrar om detta kan gå, annars får jag göra en query till för att hämta resultat som är närliggande efter vad det första resultat ger, presis som du föreslår med "<" och ">".

Postalcode är en INT, föresten.

nitro2k01Medlem sedan aug. 20037 630 inlägg
#4

Jaha, jag missuppfattade vad du menade... Du har namnet på en ort och vill veta närrliggande orter. Du behöver en join.
Pröva:

SELECT s2.postalcode AS postalcode, s2.postalcity AS postalcity FROM store AS s1
LEFT JOIN store AS s2 ON 
  s2.postalcode > s1.postalcode - 1000 AND
  s2.postalcode < s1.postalcode + 1000
WHERE s1.postalcity = 'Göteborg' AND s2.postalcode != s1.postalcode
ORDER BY ABS(CONVERT(s2.postalcode, SIGNED) - CONVERT(s1.postalcode, SIGNED));

"AND s2.postalcode != s1.postalcode" gör att den ort man söker efter inte kommer med i listan. (Jag gissar att det är så du vill ha det, i annat fall plocka bort det)
ORDER BY-satsen gör att de orter som har mest närliggande postnummer läggs överst i listan. Den kan du ta bort om du så önskar, eller byta ut mot ORDER BY postalcity ASC för alfabetisk ordning.

startailMedlem sedan sep. 2000159 inlägg
#5

Det var presis vad jag behövde, tack för hjälpen

Genererad på 382 ms · cache AV · v20260730165559-full.f96bc7eb