Avatar billede wolstrup Nybegynder
07. marts 2008 - 14:16 Der er 46 kommentarer

Query med kommastreng

Har brug for at kunne matche op på en kommasepareret i en query, hvis mindst en værdi matcher skal dataen trækkes ud.

Eksempel:

$streng = '1,8,3';

Feltet i db kunne så f.eks. indeholde 2,9,8 og her er en fællesværdi i 8, og query´en skal så returnere data. Kan det overhovedet lade sig gøre direkte i queryen?
Avatar billede jokkejensen Novice
07. marts 2008 - 14:19 #1
psuedo:

var sql;

sql = "select * from tabel "
foreach(int s in $streng)
{
sql +="where colonne = " +s;
}
Avatar billede jokkejensen Novice
07. marts 2008 - 14:20 #2
nåå det er en streng.. øhmm brug

Psuedo:
for(int i = 0; $streng.split(,).length; i++)
Avatar billede jokkejensen Novice
07. marts 2008 - 14:23 #3
Avatar billede wolstrup Nybegynder
07. marts 2008 - 14:28 #4
Er ikke lige helt med, giver det mig ikke kun noget retur hvis mit felt matcher præcis en af de værdier du hiver ud af min streng?
Avatar billede jokkejensen Novice
07. marts 2008 - 14:32 #5
jo sorry


for(int i = 0; $streng.split(,).length; i++)
{
if(i = 0 or $streng.split(,).length = 1)
sql +=" where colonne = " +s;
else
sql +=" OR where colonne = " +s;
}

Echo sql;
Avatar billede jokkejensen Novice
07. marts 2008 - 14:33 #6
i=0 er vist nok i den ifsætning
Avatar billede jokkejensen Novice
07. marts 2008 - 14:34 #7
lol..


sql +=" OR colonne = " +s;

/JJ
Avatar billede jokkejensen Novice
07. marts 2008 - 14:34 #8
for(int i = 0; $streng.split(,).length; i++)
{
if(i = 0)
sql +=" where colonne = " +s;
else
sql +=" OR colonne = " +s;
}
Avatar billede dkfire Nybegynder
07. marts 2008 - 14:42 #9
Det er en meget dårlig database struktur at have et felt med flere værdier. Et felt bør kun indeholde en værdi og ikke mere.
Avatar billede wolstrup Nybegynder
07. marts 2008 - 14:46 #10
Jokkejensen, beklager ulejligheden men kan du forkrome din kode lidt, kan ikke rigtig få den samlet så den funker.
Avatar billede jokkejensen Novice
07. marts 2008 - 14:53 #11
hehe jeg kender ikke til php..

Men noget ala:

$streng = '1,8,3';
$streng_array = $streng.split(',');
$i = 0;


$sql = "Select * from tabel where "
for($i=0; $streng_array.lenght; i++)
{
if($i = 0)
$sql+= "colonne = " + $streng_array[$i];
else
$sql+= "or colonne = " +$streng_array[$i]
}

Der er sikkert en masse fejl men har aldrig brugt php, der er sikkert en der lige kan fikse det..

/JJ
Avatar billede jokkejensen Novice
07. marts 2008 - 14:53 #12
for($i=0; $streng_array.lenght; $i++)
Avatar billede jokkejensen Novice
07. marts 2008 - 14:58 #13
måske : $streng_array = array($streng.split(','));
Avatar billede wolstrup Nybegynder
07. marts 2008 - 15:01 #14
Nej synes godt jeg kunne fornemme det :) Men nice nok.. Men da colonne jo kan indholde f.eks. 1,9,3 skal jeg vel vende den og bruge IN, altså $streng_array[$i] IN (colonne), men bliver den for tung?
Avatar billede jokkejensen Novice
07. marts 2008 - 15:07 #15
Kan der være 2 decimal tal ?

altså 10 og 22 ?

/JJ
Avatar billede jokkejensen Novice
07. marts 2008 - 15:09 #16
(men mange til mange relationer løses oftes ved at normalisere)
Avatar billede wolstrup Nybegynder
07. marts 2008 - 15:09 #17
Yes, det kan den godt.
Avatar billede jokkejensen Novice
07. marts 2008 - 15:15 #18
okay - så bliver det straks noget mere komplext..

Er du sikker på du ikke skal rulle lidt tilbage i din udvikling og gøre som dkfire foreslår, altså normalisere den ned på et fornuftigt niveau?

/JJ
Avatar billede dkfire Nybegynder
07. marts 2008 - 15:16 #19
Du kunne lave noget ala:
SELECT * FROM tabelnavn WHERE felt IN( $streng )

Eller hvis jokkejensen's eksempel skal virke:

$streng = '1,8,3';
$streng_array = explode(',', $streng);

$sql = "SELECT * FORM tabelnavn WHERE";

for($i = 0; $i < count($streng_array); $i++)
{
    if($i == 0){
        $sql .= "felt LIKE '%".$streng_array[$i]."%'";
    }else
        $sql .= "OR felt LIKE '%".$streng_array[$i]."%'";
}
Avatar billede wolstrup Nybegynder
07. marts 2008 - 15:21 #20
jokkejensen > Desværre too late for that :)
dkfire > Hvad vil du anbefale LIKE eller IN, hvad trækker mindst i db?
Avatar billede dkfire Nybegynder
07. marts 2008 - 17:07 #21
Jeg tror ikke IN virker, ellers er det nok den som er hurtigst og bedst, du vil med LIKE få for mange forskellige muligeheder, og så vil den ikke kunne kende forskel mellem 21 og 1 hvis du søger efter 1.

Men det helt rigtige måde er at normalisere dine tabeller så du ikke har flere værdier i samme felt. Du vil få alt for mange problemer med flere værdier i samme felt.
Avatar billede wolstrup Nybegynder
07. marts 2008 - 17:15 #22
Som sagt kan jeg desværre ikke ændre det, men må prøve mig lidt frem.. Tror nu godt IN skal virke, men det bliver selvfølgelig ikke den optimale løsning.
Avatar billede dkfire Nybegynder
07. marts 2008 - 17:17 #23
Hvordan kan det være du ikke kan ændre det, hvis jeg må spørge ?
Avatar billede wolstrup Nybegynder
07. marts 2008 - 17:31 #24
Det må du ikke ;)
Avatar billede dkfire Nybegynder
07. marts 2008 - 17:36 #25
Du vil få et kæmpe problem hvis og når du skal opdatere dit felt med en ny værdi.
Avatar billede wolstrup Nybegynder
07. marts 2008 - 17:37 #26
Det bliver heldigvis intet problem i den store sammenhæng.. Har kun det her ene lille issue.. Men den er vidst snart løst.
Avatar billede dkfire Nybegynder
07. marts 2008 - 17:52 #27
Okay, jeg kan ikke lige følge dig i at det IKKE bliver et problem. Du skal lave så meget ekstra kode for at tilføje eller fjerne et tal fra dit felt at det slet ikke giver mening at bibeholde den struktur for dine tabeller. Og hvis du alligevel begynder at tænke på hvad der er hurtigst for databasen ang. LIKE og IN, så skal du også tage i betrækning at din struktur bestemt også har indflydelse på hvor hurtig og effektiv din database er.
At have en database struktur, i et større system, som i det mindste ikke er normaliseret til grad 2 er fuldstændig tåbeligt.
Avatar billede wolstrup Nybegynder
07. marts 2008 - 17:56 #28
Jamen hvis jeg ikke skal tilføje eller fjerne fra mit felt?
Avatar billede dkfire Nybegynder
07. marts 2008 - 18:00 #29
Hvordan går du så værdier i dit felt ???
Avatar billede wolstrup Nybegynder
07. marts 2008 - 18:02 #30
opsamling fra form (checkboxe), når strengen er skabt kan den ikke ændres..
Avatar billede dkfire Nybegynder
07. marts 2008 - 18:22 #31
Har du test om IN virker ??
Avatar billede olebole Juniormester
07. marts 2008 - 18:28 #32
<ole>

Det ligner en uhensigtsmæssig tilgang. Umiddelbart kunne jeg forestille mig, det bliver en ekstremt skidt performende forespørgsel med alle de LIKE's eller IN's. Uden at vide, hvad du præcist skal lave, er det dog svært at anbefale et alternativ

/mvh
</bole>
Avatar billede wolstrup Nybegynder
07. marts 2008 - 18:37 #33
Jamen da jeg har omkring 3500 gode grunde (poster i db), til ikke at ændre strukturen i databasen, ledte jeg egentlig bare efter en query som nogenlunde kan klare presset. Håbede at en mysql guru kunne komme med et godt løsningsforslag, men det lader til at der ikke er andre forslag end LIKE, eller IN?
Avatar billede dkfire Nybegynder
07. marts 2008 - 18:37 #34
Jeg er også meget i tvivl om at IN virker efter hensigten. Og med LIKE kan jeg kun give olebole ret, det vil slet ikke være godt for serveren. Men som sagt der findes ingen alternativer når opbygningen ikke er normaliseret.
Avatar billede dkfire Nybegynder
07. marts 2008 - 18:39 #35
Jamen der findes jo ikke nogle lette måder, da man jo ikke skal designe sine tabeller på den måde. Hvorfor lave en funktionen som ikke skal bruges.
Avatar billede olebole Juniormester
07. marts 2008 - 18:39 #36
wolstrup >> Nej, det er 3500 dårlige grunde  ;o)
Hvis du laver et lille script, der ændrer din DB, tager det næppe mere end et minut at køre sciptet på DB'en
Avatar billede wolstrup Nybegynder
07. marts 2008 - 18:42 #37
Jamen der er ingen tvivl om at hvis jeg havde mulighed for at rive hele skidtet ned og starte forfra, ville det være den eneste rigtige løsning. Er desværre ikke så privilegeret, så må have det bedste ud af det med den database der nu foreligger :)
Avatar billede wolstrup Nybegynder
07. marts 2008 - 18:44 #38
Hehe ole du har ret.. Meen skal jo så hele koden igennem for at se om ændringen laver løjer i den andre steder, og skal lige sige at der er en pænt stor del af koden som ikke er udforsket endnu. Puha, er der virkelig ingen anden vej :)
Avatar billede dkfire Nybegynder
07. marts 2008 - 18:48 #39
Nej desværre, det er derfor meget vigtigt at have den rigtige struktur på databasen fra start, og have tænkt alt igennem inden der kodes noget som helst php.
Avatar billede wolstrup Nybegynder
07. marts 2008 - 18:59 #40
Ja dkfire, tror jeg vil sende denne korrespondance til den tidligere udvikler med din seneste kommentar highlighted :) Der var ellers lige en lille frækkert her man kunne kigge nærmere på http://www.thescripts.com/forum/thread141874.html
Avatar billede dkfire Nybegynder
07. marts 2008 - 19:20 #41
Tak skæbne, hvis du skal udføre den query for en tabel med 3500+ rækker, så tror jeg hurtigt du kommer til at lægge din server ned.
Avatar billede olebole Juniormester
07. marts 2008 - 19:27 #42
"tror jeg vil sende denne korrespondance til den tidligere udvikler" >> "den tidligere indvikler" ville nok være en mere præcis beskrivelse  ;o)

Programmering foregår langt hen ad vejen i hovedet - derefter på papir med streger, pile kasser og nussede kommentarer - derefter i et (evt. grafisk) dokumentations program.

Når alt er færdigprogrammeret, skal applikationen bare færdiggøres ved at skrive koden i en tekst editor, så den kan afvikles på serveren  :)
Avatar billede olebole Juniormester
07. marts 2008 - 19:31 #43
- men alt formange begynder der, hvor applikationen burde være færdigprogrammeret ... hvilket præcis er årsagen til, du nu sidder med den gang sovs  :o|
Avatar billede erikjacobsen Ekspert
07. marts 2008 - 19:35 #44
"...vigtigt at have den rigtige struktur på databasen fra start, og have tænkt alt igennem..."  Jah, der skal nok findes et par små, og trivielle applikationer, hvor det kan lade sig gøre. Vi andre forsøger derimod at designe ud fra forventningen om forandring, og bygger systemet med moduler/lag/mønstre (kært barn ...) så en ændring i fx tabelstrukturen blot giver få og lokale ændringer i koden. Så har man fornøjelsen at lære af sine erfaringer.
Avatar billede dkfire Nybegynder
07. marts 2008 - 19:38 #45
erik: det er vel også en måde at have den rigtige strukturer sin database/kode.
Avatar billede erikjacobsen Ekspert
07. marts 2008 - 19:45 #46
Jeg er sikker på vi i alt væsentligt mener det samme, så lad os ikke komme ud i noget med diminutive insekters gøren og laden i indbyrdes tvekønnet samkvem (spm/822750)  ;)

Det hjælper ikke spørgeren, som er den eneste der kan afgøre om en tablescan (lineær søgning) ved hver forespørgsel kan forsvares, eller om tiden er bedst brugt på en omkodning.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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