WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Matcha kommaseparerade nummer (https://www.wn.se/forum/showthread.php?t=10036)

Lukas 2005-09-27 09:57

Jag behöver hämta alla poster från en tabell där fältet "category" t ex har värdet "5", antingen som ett enskilt nummer ("5") eller som en del i en kommaseparerad lista, t ex "1,5" eller "1,4,5,13" eller "5,8,12"
Att skriva category = 5 leder som bekant till att bara "singlar" visas, och om jag skriver category LIKE '%5%' så får jag ju med allt som har kategori 15 (t ex "7,9,15") då fältet category kan ha högre värden än 9.
Hur löser man det på ett smidigt sätt?

Mvh Lukas

Martin 2005-09-27 10:16

Testa detta:

category LIKE '%5%' AND catergory NOT LIKE '-5'

där '-' kan vara ett nummer 0-9.

Då försvinner 15, 25, 55 osv...

Har inte testat om det fungerar men kör du mysql så ska det nog fungera...

Robert 2005-09-27 10:18

kolla efter '%,5%' samt '%5,%' ???? :)

Lukas 2005-09-27 11:08

Citat:

Originally posted by Martin@Sep 27 2005, 10:16
Testa detta:
category LIKE %5% AND catergory NOT LIKE -5
där - kan vara ett nummer 0-9.
Då försvinner 15, 25, 55 osv...
Har inte testat om det fungerar men kör du mysql så ska det nog fungera...


Löste det med att kolla efter '5,%' samt '%,5,%' samt '%,5'
Tack för tipset med "-", kommer nog att behöva matcha siffror i andra mysql-grejer.

Mikael Simonsson 2005-09-27 11:34

Citat:

Originally posted by Martin@Sep 27 2005, 10:16
Testa detta:
category LIKE %5% AND catergory NOT LIKE -5
där - kan vara ett nummer 0-9.
Då försvinner 15, 25, 55 osv...
Har inte testat om det fungerar men kör du mysql så ska det nog fungera...

LIKE i MySQL har bara två "wildcards":
% Matches any number of characters, even zero characters
_ Matches exactly one character

Med REGEXP kan man använda reguljära uttryck, t.ex.:
... WHERE catergory REGEXP 'uttryck';

(För mer info: http://dev.mysql.com/doc/mysql/en/regexp.html)

grazzy 2005-09-27 12:29

Inte för att vara en tråkmåns, men har du ett fält som ser ut sådär har du till 99%s sannolikhet designat din databas fel.

Använd istället en extern tabell kallad item2cat som innehåller {item_id, kat_id}. Då kan du istället skriva dina sökningar i stil med:
SELECT ... FROM item LEFT JOIN item2cat ON (item.id = item2kat.item_id) WHERE item2kat.kat_id IN(5,10,15, ...);

zoran 2005-09-28 07:09

Citat:

Originally posted by grazzy@Sep 27 2005, 12:29
Inte för att vara en tråkmåns, men har du ett fält som ser ut sådär har du till 99%s sannolikhet designat din databas fel.

Använd istället en extern tabell kallad item2cat som innehåller {item_id, kat_id}. Då kan du istället skriva dina sökningar i stil med:
SELECT ... FROM item LEFT JOIN item2cat ON (item.id = item2kat.item_id) WHERE item2kat.kat_id IN(5,10,15, ...);

Det var precis vad jag tänkte skriva. Helt galen databasdesign.

Lukas 2005-09-29 11:45

Citat:

Originally posted by zoran@Sep 28 2005, 07:09
Det var precis vad jag tänkte skriva. Helt galen databasdesign.
Får väl ta och lära mig använda JOIN då :)
På vilket sätt är databasdesignen galen, är det pga resurskrävande frågor eller mindre bra utbyggbarhet?

grazzy 2005-09-29 12:08

Både och i detta fallet. Att göra en LIKE-sträng-matchning mot jämfört mot att matcha ett indexerat heltal är inte särskilt skalbart. Utbyggbart är det väl såvida du inte har artiklar som finns i tusentals kategorier.

Det du eftersträvar kallas för normalisering, det innebär i princip att man aldrig sparar mer än ett värd i ett fält. Det är rätt enkelt att visualisera, du sparar inte "adress" som ett fält med "namn, address, postnummer, stad" utan du separerar det i 4 olika fält. Om du skulle göra detta med ditt ovanstående fält så får du problem eftersom du vill ha ett obestämt antal kategorier till varje produkt. Då måste man ha en extra tabell.

En utmärkt referens för att lära sig grunderna finns på http://www.databasteknik.se/webbkursen/

zoran 2005-09-29 14:18

Citat:

Ursprungligen postat av Lukas
Citat:

Ursprungligen postat av zoran
Det var precis vad jag tänkte skriva. Helt galen databasdesign.

Får väl ta och lära mig använda JOIN då :)
På vilket sätt är databasdesignen galen, är det pga resurskrävande frågor eller mindre bra utbyggbarhet?

Tänk så här, vad händer när du vill dra bort ett kategori och lägga till ett annat för ett visst objekt. Eller om alla objekt som tillhörde kategori 2 ska flyttas till kategori 212?

Det är rena mardrömmen att skapa querys för det.


Alla tider är GMT +2. Klockan är nu 06:17.

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