Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[MySQL] 1 op meer relatie, zoekactie

Pagina: 1
Acties:

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 18:55
Hallo Tweakers,

Ik heb een probleem met een query. Ik heb de volgende tabellen:

SQL:
1
2
3
4
CREATE TABLE IF NOT EXISTS `profielen` (
  `naam` varchar(25) NOT NULL,
  PRIMARY KEY  (`naam`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

en
SQL:
1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `talen` (
  `taalID` int(11) NOT NULL auto_increment,
  `naam` varchar(25) NOT NULL,
  `taal` varchar(5) NOT NULL,
  PRIMARY KEY  (`taalID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5420 ;


Een profiel kan meerdere talen aan zich hebben gekoppeld.
Nu wil ik , als ik bijvoorbeeld NL als taal mee geef, dat alle profielen die een koppeling 'NL' aan zich hebben. Dat die worden teruggegven. Alleen ik krijg maar geen goeie query, en als ik er wel al 1 heb, dan is deze rete sloom.

Wat ik tot nu toe heb (uitgaan van de taal NL):
SQL:
1
2
3
4
5
6
SELECT *
FROM profielen
WHERE (SELECT       COUNT(*) AS aantal
                                         FROM       talen
                                         WHERE      talen.naam      = profielen.naam AND
                                                    talen.taal      = "NL") != 0

of bij meerdere talen:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT *
FROM profielen
WHERE (SELECT       COUNT(*) AS aantal
                                         FROM       talen
                                         WHERE      talen.naam      = profielen.naam AND
                                                    talen.taal      = "NL") != 0 OR
(SELECT     COUNT(*) AS aantal
                                         FROM       talen
                                         WHERE      talen.naam      = profielen.naam AND
                                                    talen.taal      = "DE") != 0

of
SQL:
1
2
3
4
5
6
SELECT *
FROM profielen
WHERE (SELECT       COUNT(*) AS aantal
                                         FROM       talen
                                         WHERE      talen.naam      = profielen.naam AND
                                                    (talen.taal     = "NL" OR talen.taal        = "DE")) != 0


Alleen dit is zo sloom. Weet iemand een betere oplossing?
Ik kan op dit moment er niet op komen en google heeft me ook niet echt geholpen want ik wist niet precies waar op te zoeken.

Bij voorbaat dank :)

p.s. sorry voor de rare titel :)

  • asfaloth_arwen
  • Registratie: Februari 2005
  • Nu online
Oke, je primary key een varchar van 25, en dan vergelijkingen gaan doen. Wat dacht je van een naam_id?

Edit: voor taal gebruik je wel een ID, alleen int(11)? Gebruik deze id dan ook als foreign key in de profielen. Hoeveel talen wil je ondersteunen?

Heb je betere uitleg wat je wil en wat je huidige database ontwerp is (schema oid? )

[ Voor 59% gewijzigd door asfaloth_arwen op 23-06-2008 21:52 ]

Specs


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Of ik snap het niet, of het wordt tijd voor TS om sql te leren. Dit lijkt wel een hele moeilijke manier om iets als een join te doen, of iets met IN. En daarnaast heb je hier maar 1 tabel nodig in deze query lijkt wel. Wat is er mis met
SQL:
1
select naam from talen where taal='nl'
?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • asfaloth_arwen
  • Registratie: Februari 2005
  • Nu online
Hij wil de naam van de taal graag matchen met een foreign key taal in de profielen tabel als ik het goed begrijp... Alleen dit komt niet overeen met zijn tabellen. profielen 1-*talen dus.

In dat geval zou ik de taal_id als foreign key gebruiken in de profielen tabel.

[ Voor 21% gewijzigd door asfaloth_arwen op 23-06-2008 22:09 ]

Specs


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 16:50
Je kan toch gewoon het volgende doen, of mis ik iets ? :X

SQL:
1
2
3
4
5
6
7
8
9
SELECT
  p.*
FROM 
  `profielen` AS p,
  `talen` AS t
WHERE
  p.naam = t.naam
AND
  p.naam IN ( "NL", "DE" )

What do you mean I have no life? I am a gamer, I got millions!


  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
@Morax Dat zou meerdere records opleveren..

volgens mij is het:
SQL:
1
2
3
4
5
6
7
select p.naam
from profielen p
where p.naam in (
  select t.naam 
  from talen t 
  where t.taal in ('NL', 'DE')
)

wat overigens hetzelfde oplevert als:
SQL:
1
2
3
select distinct t.naam
from talen t
where t.taal in ('NL', 'DE')

zoals pedorus al zei dus.. maar ik neem aan dat je query nog wel wat uitgebreider zal worden.

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 18:55
mja, waarom het database structuur zo krikky was kwam omdat alle dat uit een XML haal. en ik hield me aan die structuur.

Ik heb het aangepast en heb nu het volgende:

profielen tabel:
SQL:
1
2
3
4
5
CREATE TABLE IF NOT EXISTS `profielen` (
  `profielID` int(11) NOT NULL auto_increment,
  `naam` varchar(25) NOT NULL,
  PRIMARY KEY  (`profielID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2820 ;

talen tabel:
SQL:
1
2
3
4
CREATE TABLE IF NOT EXISTS `talen` (
  `profielID` int(11) NOT NULL,
  `taal` varchar(5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Er kunnen dus meerdere talen aan 1 profiel hangen. Een persoon (profiel) kan meerdere talen spreken.

Nu ben ik dus bezig met een filter. Als ik de mensen wil filteren die nederlands (NL) of frans (FR) praten. Daarvoor wil ik dus een query hebben. En daar kom ik niet uit.
Iemand suggesties?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ja, dááág, mensen doen een join voor en daar ga je vervolgens helemaal niet op in?

Ontopic, het antwoord: probeer eens een join. :Y)

{signature}


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 16:25

Creepy

Tactical Espionage Splatterer

Daar kom je niet uit? Dus wat heb je dan nog meer geprobeerd en wat lukte daar dan niet mee?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Cartman!
  • Registratie: April 2000
  • Niet online
Je kunt ook 3 tabellen maken, 1 voor de talen, 1 voor de profielen en daartussen een koppeltabel die de combinaties verbind of begrijp ik nu niet wat je wil... sowieso gebruik je geen string als key in de andere tabel maar een id.

trouwens, je gebruikt zonder toestemming mn webicon, heb je er mail over gestuurd.
Pagina: 1