[mysql] nieuwsreacties optellen

Pagina: 1
Acties:

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Ik heb weer eens een probleem, ik ben bezig met een nieuwssysteempje en nu ben ik een query in elkaar aan het draaien om de headlines op te halen, met het aantal reacties (in een ander tabel). Maar nu zit ik vast, ik denk dat het met een join moet, maar hoe? :S

De code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
                `nieuws`.`nieuws_id`,
                `nieuws`.`titel`,
                `nieuws`.`intro`,
                `nieuws`.`tijd`,
                `nieuws_reacties`.`reactie_id`
            FROM
                `nieuws`,
                `nieuws_reacties`
            WHERE
                `nieuws`.`status` = 1
                `nieuws_reacties`.`status` = 1
            AND
                `nieuws`.`nieuws_id` = `nieuws_reacties`.`nieuws_id`
            ORDER BY
                `nieuws`.`tijd`
            LIMIT 0,3

Ik krijg nu gewoon 0 terug, en zodra er wel een reactie in de tabel staat, krijg ik wel een resultaat terug, maar ik wil altijd een resultaat, ook al zijn er geen reacties ;).

En dit: `nieuws_reacties`.`reactie_id` moet nog vervangen worden door COUNT maar `nieuws_reacties`.COUNT(`reactie_id`) werkt niet??

Mijn tabellen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE `nieuws` (
  `nieuws_id` int(3) NOT NULL auto_increment,
  `titel` varchar(255) NOT NULL default '',
  `intro` tinytext NOT NULL,
  `bericht` longtext NOT NULL,
  `tijd` int(11) NOT NULL default '0',
  `ip` varchar(15) NOT NULL default '',
  `status` int(1) NOT NULL default '0',
  PRIMARY KEY  (`nieuws_id`)
) TYPE=MyISAM;

CREATE TABLE `nieuws_reacties` (
  `reactie_id` int(3) NOT NULL auto_increment,
  `nieuws_id` int(3) NOT NULL default '0',
  `bericht` text NOT NULL,
  `naam` varchar(20) NOT NULL default '',
  `email` varchar(50) NOT NULL default '',
  `homepage` varchar(50) NOT NULL default '',
  `tijd` int(11) NOT NULL default '0',
  `ip` varchar(15) NOT NULL default '',
  `status` int(1) NOT NULL default '0',
  `bewerkt` int(1) NOT NULL default '0',
  PRIMARY KEY  (`reactie_id`)
) TYPE=MyISAM;

Alvast bedankt :)

Hoi!


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

Er staat mij bij dat je voor een COUNT een 2de select-statement nodig hebt.
Ik zou het anders oplossen; met een trigger:
Op het moment dat er een record bijkomt in 'nieuws-reacties', zou ik in tabel 'nieuws' het toe te voegen veld 'aantal-reactie', default=0, met 1 laten ophogen.

eagle


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Voor COUNT heb je in dit geval een subquery nodig, en dat kan in lagere versies van MySQL dan 4.1 niet. Je kan dus waarschijnlijk het beste doen wat Brothar zegt, of een extra query uitvoeren waarin je een COUNT doet. Beiden zullen niet echt een probleem vormen lijkt me. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 21-05 14:21

ripexx

bibs

Even uit het blote hoofd in enkele seconden :o Ik weet niet of je hiermee ook de items zonder reactie afvangt maar het zou iets als dit moeten zijn. Je dient te grouperen op alle noodzakelijke velden, hoewel mysql dat opzich niet zo'n probleem vindt maar dat ligt aan de opzet van mysql en de group by functionaliteit.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT
                `nieuws`.`nieuws_id`,
                `nieuws`.`titel`,
                `nieuws`.`intro`,
                `nieuws`.`tijd`,
                count(`nieuws_reacties`.`reactie_id`) AS aantal
            FROM
                `nieuws`,
            LEFT JOIN `nieuws_reacties`
                 ON `nieuws`.`nieuws_id` = `nieuws_reacties`.`nieuws_id`
            WHERE 
                `nieuws`.`status` = 1
            AND
                `nieuws_reacties`.`status` = 1
            GROUP BY
                `nieuws`.`nieuws_id`,
                `nieuws`.`titel`,
                `nieuws`.`intro`,
                `nieuws`.`tijd
            ORDER BY
                `nieuws`.`tijd`


Opmerking, waarom gebruik je een INT(1) ipv ENUM voor je status? ENUM is het type dat je hiervoor wil gebruiken. Zelfde geldt voor de tijd INT terwijl je hiervoor ook verschillende DATE/TIME type kan gebruiken. Gezien je type denk ik dat je de timestamp opslaat ;)

buit is binnen sukkel


  • kmf
  • Registratie: November 2000
  • Niet online

kmf

Je kan idd met een select count(...iets..) de hoeveelheid reacties krijgen.
Ik heb niet zo'n zin om de hoeveelheid bytes aan disk I/O/ram uit te rekenen die een join nodig zal hebben, maar ik denk dat een losse subquery waarschijnlijk minder resources zal vergen.


Maar even iets helemaal anders. Je kan natuurlijk ook voorbeeld van een forum nemen, en 1 tabel topic maken en 1 tabel posts. Dan hoef je alleen maar de eerste topic te selecteren als nieuws, de rest gewoon weglaten.
Bij het updaten/posten van reacties kan je dan in een "totalposts"-veld in tabel topic deze bijhouden. Werkt ook wel goed denk ik en kan je later weer een forum van maken ;)

[ Voor 6% gewijzigd door kmf op 08-10-2004 01:45 ]

One thing's certain: the iPad seriously increases toilet time.. tibber uitnodigingscode: bqufpqmp


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 21-05 14:21

ripexx

bibs

athlonkmf schreef op 08 oktober 2004 @ 01:44:
Je kan idd met een select count(...iets..) de hoeveelheid reacties krijgen.
Ik heb niet zo'n zin om de hoeveelheid bytes aan disk I/O/ram uit te rekenen die een join nodig zal hebben, maar ik denk dat een losse subquery waarschijnlijk minder resources zal vergen.
Alleen als je niet de mogelijkheid hebt tot subqueries (mysql < 4.1) dan moet je wel een join gebruiken. Verder denk ik persoonlijk dat een goed geimplementeerde subquery stukken sneller zal zijn.
Maar even iets helemaal anders. Je kan natuurlijk ook voorbeeld van een forum nemen, en 1 tabel topic maken en 1 tabel posts. Dan hoef je alleen maar de eerste topic te selecteren als nieuws, de rest gewoon weglaten.
Bij het updaten/posten van reacties kan je dan in een "totalposts"-veld in tabel topic deze bijhouden. Werkt ook wel goed denk ik en kan je later weer een forum van maken ;)
Tja als je een "echte" RDBMS gebruik met triggers, views etc kan je hier natuurlijk veel slimmere oplossingen voor kiezen maar dat zit nog niet in mysql dus houdt het snel op.

buit is binnen sukkel


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

NMe84:
Voor COUNT heb je in dit geval een subquery nodig,
Dit kan prima met een JOIN.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1