Hallo allemaal,

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

Ik heb nu

<?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?
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.
@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:


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
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:

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.
(Het is nog vroeg)

Doet deze query niet precies hetzelfde?


SELECT 
        COUNT(r.id) AS aantal
FROM 
        reacties AS r, artikelen AS a
WHERE 
         a.id = r.artikel_id AND a.reageren = 'j';
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.
@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)

Reageren