/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Join med REGEXP, eller..?
Fra : Rander


Dato : 18-03-09 01:21

Jeg har en MySql-database, indeholdende to tabeller.

Tabellen Medlemmer indeholder felterne Navn og Grupper.

Tabellen GruppeNavne indeholder Nummer og GruppeNavn.

Nu vil jeg gerne have konstrueret en forespørgsel der returnerer
Medlemsnavn samt navnet på gruppen vedkommende er i - og det er jo
egentlig nemt nok:

SELECT Navn, GruppeNavn FROM Medlemmer LEFT JOIN GruppeNavne ON
Medlemmer.Grupper = GruppeNavne.Nummer

Nu er der bare det ved det, at et medlem kan være i flere grupper, som
gemmes i Grupper-feltet adskilt af punktummer - hvis et medlem f.eks. er
med i grupperne 1, 3 og 9 vil vedkommendes Grupper-felt indeholde
".1.3.9" - når jeg så skal have fat i alle i f.eks. gruppe 3 bruger jeg

Select Navn FROM Medlemmer WHERE Grupper REGEXP('^\\\.3$|\\\.3\\\.|\\\.3$')

Men hvordan er det lige at jeg så kombinerer de to, så jeg får
returneret medlemsnavne og tilhørende gruppenavn(e)? Jeg har prøvet
noget i stil med

SELECT Navn, GruppeNavn FROM Medlemmer LEFT JOIN GruppeNavne ON
Medlemmer.Grupper =
REGEXP('^\\\.'+GruppeNavne.Nummer+'$|\\\.'+GruppeNavne.Nummer+'\\\.|\\\.'+GruppeNavne.Nummer+'$')

men så får jeg blot returneret hver navn som tilhørende alle grupper -
så hvis der er ti grupper indeholder de ti første records alle Navn1 med
en record for hver gruppes navn, derefter 10 records med Navn2 osv... 10
records for hvert navn, uanset hvor mange grupper de er med i...

--
Lars Rander ** Pil ikke ved min adresse ** :(){ :&:& };:
http://bamsepetting.dk

Moralsk indignation er jalousi med en glorie. (H. G. Wells)

 
 
Kristian Damm Jensen (18-03-2009)
Kommentar
Fra : Kristian Damm Jensen


Dato : 18-03-09 12:12

Rander wrote:
> Jeg har en MySql-database, indeholdende to tabeller.
>
> Tabellen Medlemmer indeholder felterne Navn og Grupper.
>
> Tabellen GruppeNavne indeholder Nummer og GruppeNavn.
>
> Nu vil jeg gerne have konstrueret en forespørgsel der returnerer
> Medlemsnavn samt navnet på gruppen vedkommende er i - og det er jo
> egentlig nemt nok:
>
> SELECT Navn, GruppeNavn FROM Medlemmer LEFT JOIN GruppeNavne ON
> Medlemmer.Grupper = GruppeNavne.Nummer
>
> Nu er der bare det ved det, at et medlem kan være i flere grupper, som
> gemmes i Grupper-feltet adskilt af punktummer - hvis et medlem f.eks.
> er med i grupperne 1, 3 og 9 vil vedkommendes Grupper-felt indeholde
> ".1.3.9" - når jeg så skal have fat i alle i f.eks. gruppe 3 bruger
> jeg
> Select Navn FROM Medlemmer WHERE Grupper
> REGEXP('^\\\.3$|\\\.3\\\.|\\\.3$')

Gys.

Min anbefaling: Sørg for at få normaliseret din database, i det mindste til
første normalform.


--
Venlig hilsen/Best regards
Kristian Damm Jensen

There are 10 kinds of people. Those who count in binary and those who
don't.



Rander (18-03-2009)
Kommentar
Fra : Rander


Dato : 18-03-09 12:31

Kristian Damm Jensen skrev noget i denne stil, den 18-03-2009 12:11:
>> Nu er der bare det ved det, at et medlem kan være i flere grupper, som
>> gemmes i Grupper-feltet adskilt af punktummer - hvis et medlem f.eks.
>> er med i grupperne 1, 3 og 9 vil vedkommendes Grupper-felt indeholde
>> ".1.3.9" - når jeg så skal have fat i alle i f.eks. gruppe 3 bruger
>> jeg
>> Select Navn FROM Medlemmer WHERE Grupper
>> REGEXP('^\\\.3$|\\\.3\\\.|\\\.3$')
> Gys.
> Min anbefaling: Sørg for at få normaliseret din database, i det mindste til
> første normalform.

Ikke forstået? Hvad mener du?

Sagen kompliceres så desværre yderligere af, at jeg ikke kan lave om på
medlemstabellen, da den er en del af et CMS...

--
Lars Rander ** Pil ikke ved min adresse ** :(){ :&:& };:
http://bamsepetting.dk

Katte er klogere end hunde. Man kan ikke få otte katte til at trække en
slæde gennem en snestorm. (Jeff Valdez)

Kristian Damm Jensen (18-03-2009)
Kommentar
Fra : Kristian Damm Jensen


Dato : 18-03-09 21:05

Rander wrote:
> Kristian Damm Jensen skrev noget i denne stil, den 18-03-2009 12:11:
>>> Nu er der bare det ved det, at et medlem kan være i flere grupper,
>>> som gemmes i Grupper-feltet adskilt af punktummer - hvis et medlem
>>> f.eks. er med i grupperne 1, 3 og 9 vil vedkommendes Grupper-felt
>>> indeholde ".1.3.9" - når jeg så skal have fat i alle i f.eks.
>>> gruppe 3 bruger jeg
>>> Select Navn FROM Medlemmer WHERE Grupper
>>> REGEXP('^\\\.3$|\\\.3\\\.|\\\.3$')
>> Gys.
>> Min anbefaling: Sørg for at få normaliseret din database, i det
>> mindste til første normalform.
>
> Ikke forstået? Hvad mener du?

Hvis du skal arbejde med databaser er det en god idé at kende til visse
basaleprincipper. Frem for at jeg skrier en roman, foreslår jeg at du kigger
http://www.udvikleren.dk/Database/Article.aspx/146/

> Sagen kompliceres så desværre yderligere af, at jeg ikke kan lave om
> på medlemstabellen, da den er en del af et CMS...

Tough luck. Der er en designer dér, der burde have skridtprygl med en våd
Berlinger.

--
Venlig hilsen/Best regards
Kristian Damm Jensen

In C we had to code our own bugs. In C++ we can inherit them. C gives
you enough rope to hang yourself. C++ also gives you the tree object to
tie it to. With C you can shoot yourself in the leg. With C++ you can
reuse the bullet.



Leif Neland (18-03-2009)
Kommentar
Fra : Leif Neland


Dato : 18-03-09 14:24


"Rander" <ldNOSPAM@rander.dk> skrev i en meddelelse
news:49c03e5a$0$90273$14726298@news.sunsite.dk...
> Jeg har en MySql-database, indeholdende to tabeller.
>
>
> Nu er der bare det ved det, at et medlem kan være i flere grupper, som
> gemmes i Grupper-feltet adskilt af punktummer - hvis et medlem f.eks. er
> med i grupperne 1, 3 og 9 vil vedkommendes Grupper-felt indeholde
> ".1.3.9" - når jeg så skal have fat i alle i f.eks. gruppe 3 bruger jeg

Når du nu er bundet til den forgræmmelige måde at have grupperne, så var det
måske en ide at lave join'et oppe i applikationen.

Altså læse tabellen af grupper ind i et array af gruppe->gruppenavn.

Grupper-feltet i databasen laver du så om til et array:

$aGruppe=array_filter(explode(".",$row['Grupper']));
//array_filter fjerner evt tomme poster, hvis Grupper starter med "."

Dette array's elementer ForEach'er du så over og slår op i gruppe-arrayet.

Leif

Ps: Dette er skrevet ret kortfattet, under den antagelse at en, der bruger
regexp ikke kan være en total begynder
Skriv gerne, hvis jeg skal finde det tykkere pap ud...




Kristian Damm Jensen (18-03-2009)
Kommentar
Fra : Kristian Damm Jensen


Dato : 18-03-09 21:15

Rander wrote:
> Jeg har en MySql-database, indeholdende to tabeller.
>
> Tabellen Medlemmer indeholder felterne Navn og Grupper.
>
> Tabellen GruppeNavne indeholder Nummer og GruppeNavn.
>
> Nu vil jeg gerne have konstrueret en forespørgsel der returnerer
> Medlemsnavn samt navnet på gruppen vedkommende er i - og det er jo
> egentlig nemt nok:
>
> SELECT Navn, GruppeNavn FROM Medlemmer LEFT JOIN GruppeNavne ON
> Medlemmer.Grupper = GruppeNavne.Nummer
>
> Nu er der bare det ved det, at et medlem kan være i flere grupper, som
> gemmes i Grupper-feltet adskilt af punktummer - hvis et medlem f.eks.
> er med i grupperne 1, 3 og 9 vil vedkommendes Grupper-felt indeholde
> ".1.3.9" - når jeg så skal have fat i alle i f.eks. gruppe 3 bruger
> jeg
> Select Navn FROM Medlemmer WHERE Grupper
> REGEXP('^\\\.3$|\\\.3\\\.|\\\.3$')
> Men hvordan er det lige at jeg så kombinerer de to, så jeg får
> returneret medlemsnavne og tilhørende gruppenavn(e)? Jeg har prøvet
> noget i stil med
>
> SELECT Navn, GruppeNavn FROM Medlemmer LEFT JOIN GruppeNavne ON
> Medlemmer.Grupper =
> REGEXP('^\\\.'+GruppeNavne.Nummer+'$|\\\.'+GruppeNavne.Nummer+'\\\.|\\\.'+GruppeNavne.Nummer+'$')
>
> men så får jeg blot returneret hver navn som tilhørende alle grupper -
> så hvis der er ti grupper indeholder de ti første records alle Navn1
> med en record for hver gruppes navn, derefter 10 records med Navn2
> osv... 10 records for hvert navn, uanset hvor mange grupper de er med
> i...

Jeg ville forsøge at filtrere den anden vej, så at sige.

select navn, gruppenavn
from medlemmer join gruppenavne

vil give dig alle navne og for hvert navn alle gruppenavne.

Vi skal nu fjerne de linier, hvor medlemmer.grupper ikke indeholder
gruppenavne.nummer. Vi skal altså undersøge om gruppenavne.nummer er
indeholdt i medlemmer.grupper. field(gruppenavne.nummer, medlemmer.grupper)
returnerer positionen i medlemmer.grupper, hvis det er tilfældet, 0 hvis det
ikke er.

Derfor burde

select navn, gruppenavn
from medlemmer join gruppenavne
where field(gruppenavne.nummer, medlemmer.grupper) <> 0

Du vil så sikkert gerne have medlemmerne med ud, selvom de ikke er med i en
gruppe. Derfor

select navn, gruppenavn
from medlemmer left join gruppenavne
on field(gruppenavne.nummer, medlemmer.grupper) <> 0


--
Venlig hilsen/Best regards
Kristian Damm Jensen

There is more money being spent on breast implants and Viagra today,
than on Alzheimer's research. This means that by 2040, there should be
a large elderly population with perky boobs and huge erections and
absolutely no recollection of what to do with them.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste