|
| 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
på 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.
| |
|
|