Aan de JOIN

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Roberto Beer

Roberto Beer

09/03/2007 22:54:00
Quote Anchor link
Hallo allemaal,

Mijn cms word steeds gecompliceerder, en dus ook de SQL.

Ik heb nu

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
                $query_sub
= "SELECT COUNT(*) FROM $subtabel WHERE artikel_id = '$huidig_artikel'";
?>


het aantal reacties op een artikel wordt weergegeven. Maar eigenlijk moet ie deze alleen uitvoeren als er op het artikel ook daaddwerkelijk gereageerd mag worden. De beheerder kan dat instellen met "reageren" ENUM 'j', 'n'. Er moet dus een soort van Join (?) tussen beide tabellen. Iemand die me kan helpen?
 
PHP hulp

PHP hulp

20/11/2024 10:25:46
 
Robert Deiman

Robert Deiman

09/03/2007 23:00:00
Quote Anchor link
http://www.phphulp.nl/php/tutorials/3/479/

Lees deze maar door, wellicht dat je er wat aan hebt :)
 
Frank -

Frank -

09/03/2007 23:29:00
Quote Anchor link
Vraagje: Heb je wel een goed datamodel opgezet? Het is namelijk wat vreemd om nu pas te constateren dat er een verband bestaat tussen 2 tabellen. Is er bv. wel een ForeignKey aanwezig?

Zo niet, ga normaliseren en vergeet niet om innoDB te gebruiken.
 
Robert Deiman

Robert Deiman

10/03/2007 08:53:00
Quote Anchor link
@Frank
Als je later bedenkt dat je reacties wilt tonen over een artikel, waarbij door de beheerde ingegeven mag worden of er op gereageerd mag worden ja of nee, dan hoeft het datamodel niet incorrect te zijn.

De tip over innoDB is een goede, maar niet alle providers hebben daar beschikking over, of hebben die beschikbaar gesteld.


Het probleempje is ook prima op te lossen met een JOIN:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT
   artikel_naam
FROM  
   artikelen AS a
INNER JOIN(
        subtabel AS s
      INNER JOIN
        reacties r
      ON r.artikel_id = s.artikel_id)
ON s.artikel_id = a.artikel_id
WHERE a.reageren = 'j';


Speel met de verschillende typen joins die ik in mijn tutorial, waar ik je eerder in het topic al naar heb verwezen, aanhaal om het juiste resultaat te krijgen
 
Joren de Wit

Joren de Wit

10/03/2007 09:36:00
Quote Anchor link
Robert, die tweede INNER JOIN is een beetje overbodig. In die JOIN koppel je r.artikel_id aan s.artikel_id en vervolgens in die andere JOIN koppel je s.artikel_id aan a.artikel_id. Als dat toch dezelfde waarden zijn, waarom dan niet direct r.artikel_id koppelen aan a.artikel_id?

Je haalt immers geen gegevens op uit subtabel, dus dat moet geen probleem zijn. Ik zou dan ook eerder een query al dit verwachten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT
    COUNT(r.id) AS aantal
FROM
    reacties AS r
INNER JOIN
    artikelen AS a
ON
    a.id = r.artikel_id
WHERE
    a.reageren = 'j'


En bovendien is het dan zoals Frank al zegt natuurlijk wel van belang dat je ook op database niveau een relatie legt tussen de tabellen. Je zult in de reacties tabel dus een foreign key op moeten nemen die verwijst naar de artikelen tabel. En met mysql is deze constraint alleen aan te brengen als je de InnoDB engine gebruikt.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
DaeDaluz

DaeDaluz

10/03/2007 09:51:00
Quote Anchor link
(Het is nog vroeg)

Doet deze query niet precies hetzelfde?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
        COUNT(r.id) AS aantal
FROM
        reacties AS r, artikelen AS a
WHERE
         a.id = r.artikel_id AND a.reageren = 'j';
 
Joren de Wit

Joren de Wit

10/03/2007 09:59:00
Quote Anchor link
Ja, een INNER JOIN kun je ook schrijven dmv een WHERE clausule waarin je de koppeling opneemt. Een verschil in schrijfwijze, maar geen verschil in uitvoering.
 
Robert Deiman

Robert Deiman

10/03/2007 16:38:00
Quote Anchor link
@Blanche

Je hebt helemaal gelijk, het was te laat gister denk ik :P (meestal is het later, maar af en toe heb ik schijnbaar wel meer slaap nodig)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.