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

MySQL JOIN vragen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dit is even mijn voorstelling waar ik op aan het oefenen ben:

Ik heb 3 tabellen gemaakt:

tabel 1 naam: reason
reason_idreason_type
1Audit
2Maintenance
3Transport
4Visit


tabel 2 naam: visit_terms
term_idterm_class
1hygiene
2Security
3Defence
4General


tabel 3 naam: reason_detail
idreason_idterm_id
111
212
313
423
524
631
733
844


Tabel 3 heeft de relatie aan tussen tabel 1 en 2. Ik heb die 3e tabel aangemaakt omdat in tabel 1 de reason type meerdere combinaties moet hebben vanuit tabel 2

Audit = Hygiene en Security en Defence
Maintenance = Hygiene en Security
..........

Wat ik nu wil is dat ik in mijn PHP bestand een SELECT doe vanuit MYSQL en als het Audit is dat hij de zaken hieraan gekoppeld uit tabel 2 in een array stopt of... (stel gerust zelf uw manier voor).

Ik heb al iets proberen te maken aan de hand van gevonden voorbeelden:

$value = $_POST['site'];
$query = "SELECT t.term_class
FROM visit_terms t
JOIN reason_detail r
ON r.id = t.id
WHERE r.reason_id = " .$value

Maar ik begrijp er na lang zoeken nog steeds niet al teveel van....

Die t na visit_terms en r na reason_detail is dat om een alias te creëren? Of waarvoor dient dit eigenlijk?

Zouden jullie de query ook zo opbouwen of geheel anders?

Zoals ik al zei het zijn voor mij oefeningen om het JOINEN goed onder de knie te krijgen

Alvast bedankt!

  • FotW
  • Registratie: Juli 2012
  • Laatst online: 24-10 13:17
Dat is inderdaad om een alias te creëren, zoals je in de ON ziet vraag je 2x een id op, zou je hier geen alias voor gebruiken dan weet je query niet in welke tabel hij moet zoeken.

Waar je wel op moet letten is het escapen van je $_POST variabele, want nu ben je kwetsbaar voor sql injection, wat anderen na mij ongetwijfeld ook zullen zeggen.

Verwijderd

Topicstarter
FotW schreef op woensdag 22 januari 2014 @ 15:55:
Dat is inderdaad om een alias te creëren, zoals je in de ON ziet vraag je 2x een id op, zou je hier geen alias voor gebruiken dan weet je query niet in welke tabel hij moet zoeken.

Waar je wel op moet letten is het escapen van je $_POST variabele, want nu ben je kwetsbaar voor sql injection, wat anderen na mij ongetwijfeld ook zullen zeggen.
Thx FotW!

Ik hou rekening met het escapen ("$escapefirstname = mysqli_real_escape_string($reason);) hoewel het gewoon om een radio button gaat ;).

Ik test eigenlijk een beetje (zonder doel en voor de fun) waar ik 4 radio buttons heb (Audit, Transport, Maintenance, Visitor) waar de data-target="#hygiene, #security,... uit mijn MySQL komt en deze aangeeft welke div zichtbaar is via jQuery. Maar via een CMS zouden de gebruikersdit makkelijk moeten kunnen veranderen.

Dit om jullie een idee te geven waarom ik de vraag stel :)

EDIT: Werk ik hier eigenlijk al met Many to Many relaties?

[ Voor 3% gewijzigd door Verwijderd op 22-01-2014 16:11 ]


  • itons
  • Registratie: Oktober 2003
  • Niet online
Volgens mij wil je wel op id=reason_id joinen en niet op id=id want dat zegt niets over de relatie tussen de tabellen.

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 09:02
FotW schreef op woensdag 22 januari 2014 @ 15:55:
Dat is inderdaad om een alias te creëren, zoals je in de ON ziet vraag je 2x een id op, zou je hier geen alias voor gebruiken dan weet je query niet in welke tabel hij moet zoeken.

Waar je wel op moet letten is het escapen van je $_POST variabele, want nu ben je kwetsbaar voor sql injection, wat anderen na mij ongetwijfeld ook zullen zeggen.
Als je het op die manier lastig vind om te lezen, kan je ook:

table AS alias gebruiken, of (in je SELECT statement) column_name AS descriptive_name.

AS mag je gebruiken om aan te geven dat je een alias maakt, maar dat hoeft niet. Is maar net wat je prettiger vindt.

Verwijderd

Topicstarter
jbdeiman schreef op woensdag 22 januari 2014 @ 16:13:
[...]


Als je het op die manier lastig vind om te lezen, kan je ook:

table AS alias gebruiken, of (in je SELECT statement) column_name AS descriptive_name.

AS mag je gebruiken om aan te geven dat je een alias maakt, maar dat hoeft niet. Is maar net wat je prettiger vindt.
Dus dat blijkt hetzelfde te zijn. Goed om dit te weten bedankt!
itons schreef op woensdag 22 januari 2014 @ 16:12:
Volgens mij wil je wel op id=reason_id joinen en niet op id=id want dat zegt niets over de relatie tussen de tabellen.
Ja dat lijkt me wel logisch. Ander kan er inderdaad geen relatie worden gevormd.

code:
1
ON id=r.id


zou wel moeten goed zijn

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 22 januari 2014 @ 16:08:
hoewel het gewoon om een radio button gaat ;).
...en dat weerhoudt mij hoe precies om 0; drop table reason_detail; te POSTen :? ;)

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat niet, maar MySQL weerhoudt je er iig van om meerdere statements in een mysql_query() te gooien :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.oisyn schreef op woensdag 22 januari 2014 @ 16:41:
Dat niet, maar MySQL weerhoudt je er iig van om meerdere statements in een mysql_query() te gooien :+
Het ging om 't idee...

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


  • DJMaze
  • Registratie: Juni 2002
  • Niet online
http://dev.mysql.com/doc/...tml#function_group-concat

code:
1
2
3
4
5
6
7
8
SELECT
    r.reason_id,
    r.reason_type,
    GROUP_CONCAT(term_class)
FROM  reason_detail rd
INNER JOIN reason r USING (reason_id)
INNER JOIN visit_terms v USING (term_id)
GROUP BY reason_id

[ Voor 3% gewijzigd door DJMaze op 22-01-2014 17:29 ]

Maak je niet druk, dat doet de compressor maar


Verwijderd

GROUP_CONCAT is zeker een krachtige oplossing maar in veel gevallen gebruik je dan achteraf weer code om je aan elkaar geknoopte string te splitten en netjes weer te geven in lijstjes en dergelijken, ook heb je hierbij (in jouw datamodel in ieder geval) niet altijd de controle over de volgorde waarin de terms aan elkaar geknoopt worden, al is dit op te lossen door een extra kolom toe te voegen met een weight/positie/prioriteit

Helaas is het tot op heden (voor zover ik weet) nog niet mogelijk nog niets in MySQL wat je echt een gelaagd resultset geeft met in jouw bijvoorbeeld 1 reason en meerdere gekoppelde terms.

Een document-based/noSQL database zoals MongoDb of CouchDb zou dit wel kunnen, of zou je met simpele 'models' kunnen werken die dit soort resultsets voor je genereren, maar meestal betekent dit meerdere queries of achteraf parsen van je resultset.

een oplossing zou kunnen zijn :

code:
1
2
$model = new ReasonTermModel($db);
$terms = $model->getAllTermsByReasonId($reasonId);


waarbij de getAllTermsByReasonId method niets anders doet dan een query uitvoeren en een resultset teruggeven.

Een andere oplossing is he gebruik van een ORM systeem als Doctrine, die automatisch models maakt die bepaalde data voor je op kunnen halen aan de hand van het door jou gespecificeerde datamodel.

Verwijderd

@.oisyn

Mysql weerhoudt je toch niet om meerdere statements, gescheiden door een ; weliswaar, achter elkaar uit te voeren ? of comments te inserten en daarna gewoon een volgende statement uit te voeren ?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op maandag 03 februari 2014 @ 23:19:
@.oisyn

Mysql weerhoudt je toch niet om meerdere statements, gescheiden door een ; weliswaar, achter elkaar uit te voeren ? of comments te inserten en daarna gewoon een volgende statement uit te voeren ?
Niet by default: http://www.php.net/manual...rt.multiple-statement.php

althans in php, het hangt van de client af. Meerdere selects kan sowieso niet, want mysql ondersteunt geen mars, maar select + update/drop/delete kan wel.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1