Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP / MySQL] Hulp met query nodig

Pagina: 1
Acties:

  • mdrop
  • Registratie: Juni 2009
  • Niet online
Ik ben bezig om een website op te zetten waarbij er gegevens van teams en spelers uit een database gehaald worden, nu werk ik qua spelers met de categorieën junioren en senioren en deze moeten ieder op een aparte pagina getoond worden. Tot op heden heb ik altijd de categorie aangegeven 'in de speler' maar dit brengt ieder seizoen weer extra werk mee vandaar de vraag of het simpeler kan;

Mijn database ziet er als volgt uit:

team => tm_id tm_naam tm_categorie tm_sponsor tm_trainer
speler = > sp_id sp_voornaam sp_achternaam sp_knvbnr sp_teamid

Nu wil ik dus graag een query maken waarbij hij de spelers ophaalt die in een junioren team zitten.
Dus hij zal moeten kijken naar team_id en met het cijfer dat daarin voor komt weer het tm_categorie ophalen.

Schematisch: Speler > sp_teamid = 1 > speler > tm_id = 1 > tm_categorie = junioren, waarna hij dus deze speler selecteert en weergeeft (= junioren speler).

Vrij warrig verhaal maar hoop dat iemand het kan begrijpen ;).

[ Voor 3% gewijzigd door mdrop op 04-03-2013 18:57 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Vrij heldere oplossing: Hoe werken joins? :Y)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • naam
  • Registratie: Oktober 2007
  • Laatst online: 05-11 17:53
Dit inderdaad, en dat in combinatie met nog een aparte tabel met de verschillende categorieën.

  • Baminge
  • Registratie: Februari 2012
  • Laatst online: 05-05 20:30
SELECT *
FROM team,speler
WHERE sp_teamid = tm_id
AND tm_categorie = 'junioren';

Ik denk dat je dit bedoeld maar ik raad je aan om zoals Roblll en naam al zeggen JOINS op te zoeken.

  • TheDevilOnLine
  • Registratie: December 2012
  • Laatst online: 18-11 16:17
Volgens mij ben je op zoek naar:

SQL:
1
2
3
4
5
6
7
8
9
SELECT
    *
FROM
    `speler`
LEFT JOIN 
    `team` ON `team`.`tm_id` = `speler`.`sp_teamid` 
WHERE 
    `team`.`tm_categorie` = 'junioren'
;


Ik gebruik hier een LEFT JOIN, maar je kan hier ook een 'normale' JOIN (JOIN == INNER JOIN) gebruiken. Het verschil zit hem in wat er gebeurd indien een speler geen team heeft of het team niet wordt gevonden.

Bij een LEFT JOIN wordt de speler opgehaald, en krijgen alle velden die je uit de tabel `team` selecteert de waarde NULL (in bovenstaande query wordt de speler dus niet opgehaald aangezien NULL != 'junioren'). Bij een normale join MOET er een join gevonden worden (dus een speler moet een team hebben en dit team moet bestaan) anders wordt die speler niet in de query geselecteerd.

P.S. De query werkt in MySQL ook zonder alle backquotes (`) en kan zelfs versimpeld worden tot
SQL:
1
SELECT * FROM speler LEFT JOIN team ON tm_id = sp_teamid WHERE tm_categorie = 'junioren';

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
TheDevilOnLine schreef op donderdag 07 maart 2013 @ 12:20:
Volgens mij ben je op zoek naar:

SQL:
1
2
3
4
5
6
7
8
9
SELECT
    *
FROM
    `speler`
LEFT JOIN 
    `team` ON `team`.`tm_id` = `speler`.`sp_teamid` 
WHERE 
    `team`.`tm_categorie` = 'junioren'
;


Ik gebruik hier een LEFT JOIN, maar je kan hier ook een 'normale' JOIN (JOIN == INNER JOIN) gebruiken. Het verschil zit hem in wat er gebeurd indien een speler geen team heeft of het team niet wordt gevonden.

Bij een LEFT JOIN wordt de speler opgehaald, en krijgen alle velden die je uit de tabel `team` selecteert de waarde NULL (in bovenstaande query wordt de speler dus niet opgehaald aangezien NULL != 'junioren'). Bij een normale join MOET er een join gevonden worden (dus een speler moet een team hebben en dit team moet bestaan) anders wordt die speler niet in de query geselecteerd.

P.S. De query werkt in MySQL ook zonder alle backquotes (`) en kan zelfs versimpeld worden tot
SQL:
1
SELECT * FROM speler LEFT JOIN team ON tm_id = sp_teamid WHERE tm_categorie = 'junioren';
Bovenstaande query wordt dankzij de WHERE conditie een INNER JOIN. En dus geen LEFT JOIN zoals je zou denken... Oorzaak: Er wordt eerst een relatie gelegd tussen beide tabellen en op dat resultaat wordt de WHERE toegepast. Het is dus verplicht om een passend team te hebben. En dus slaat de LEFT JOIN nergens op, je bedoelt een INNER JOIN. Het kan ook voor verkeerde queryplannen zorgen en dus voor performance problemen.

Wanneer je toch een LEFT JOIN wilt hebben, moet de WHERE conditie verhuizen naar de JOIN:
SQL:
1
2
3
4
5
SELECT
  * -- zet hier alle kolomnamen neer. Nooit een * gebruiken, dit voorkomt bugs
FROM 
  speler
  LEFT JOIN team ON team.tm_id = speler.sp_teamid  AND team.tm_categorie = 'junioren'

De WHERE kan dan helemaal weg.
Pagina: 1