Toon posts:

[mysql]2 querys, 1 resultaat

Pagina: 1
Acties:

Verwijderd

Topicstarter
Om voor de index van een forum het totaal aantal posts gebruik ik de volgende query:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
$query = mysql_query("
SELECT count(DISTINCT p.post_id) as total_posts, 
       count( DISTINCT t.topic_id) as total_topics, 
       c.*, 
       f.*
FROM   forums f 
INNER JOIN posts on t.topic_id = p.topic_id 
INNER JOIN topics on t.forum_id = f.forum_id, 
       cat c, 
       posts p, 
       topics t 
where  f.cat_id = c.id 
GROUP BY  c.id,
          f.forum_id
 ") or die(mysql_error());  ?>

Hij geeft alles netjes weer maar het probleem is dat als in de tabel topics geen enkele rij is die het forum_is * bevat, wordt forum * niet weergegeven op de index. Anders gezegd, een forum met 0 topics / posts blijft verborgen.

Daarom had ik 2 querys bedacht. [volgende code is wat vereenvoudigd]
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?  include('config.php');
       mysql_connect($host, $user, $pass);
       mysql_select_db($db);
       $query = mysql_query("
         SELECT count(DISTINCT t.title) as topics,
             count(DISTINCT p.post_id) as posts
     FROM   forums f,
                 topics t,
                 posts p
     WHERE  p.topic_id = t.topic_id
     AND      t.forum_id = f.forum_id
     GROUP BY f.forum_id ") or die(mysql_error());

     while ($r = mysql_fetch_array($query))
              {
               $i++;
               $forum[$i] = $r;
              }
      $query2 = mysql_query("SELECT * from forums") or die(mysql_error());
         while ($row = mysql_fetch_array($query2))
              {
               $x++;
               $cat[$x] = $row;
              }

                for($j=0; $i >= $j; $j++)
                 {
                    for($z=0; $x >= $z; $z++)
                 {
                    echo $cat[$z]['naam']; echo"<br>";
                    echo "Topics:<br>";
                    echo $forum[$j]['topics'];
                    echo "Posts:<br>";
                    echo $forum[$j]['posts'];

                 }
         }
 ?> 

Het probleem hier van is dat alles veel te vaak weergegeven wordt, dus als er 5 forums zijn wordt alles 5 keer weergegeven.
Hoe is het nou mogelijk om het resultaat van die 2 querys in 1 keer weer te geven?
(een database structuur staat hier )

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Het enige wat jij aan je eerste query moet veranderen is de join's naar topic's en posts een outer join maken, dan werkt het direct.
Eventueel kan je group by c.id weg laten. waarschijnljk is de forum id ook al uniek.
Ik zou wel een orderby toevoegen, dan dwing je tenminste de volgorde af

Verwijderd

Topicstarter
als ik er een outer join van maak dan krijg ik alles opgeteld dus:
forum 1 heeft 1 topics, 2 posts
forum 2 heeft 3 topics, 15 posts
dan krijg ik:
forum 1 heeft 4 topics, 17 posts
forum 2 heeft 4 topics, 17 posts
edit:
maar geeft hij wel alle fora weer

en met dat group by c.id (bij een inner join) weg halen gooit hij me de categorien door elkaar.

[ Voor 7% gewijzigd door Verwijderd op 25-01-2003 10:35 ]


Verwijderd

Topicstarter
inmiddels ben ik een stap verder.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
$query = mysql_query("
SELECT count(DISTINCT p.post_id) as total_posts, 
       count(DISTINCT t.topic_id) as total_topics, 
       c.*, 
       f.*
FROM   forums f,
       cat c, 
       posts p, 
       topics t 
RIGHT JOIN topics on f.forum_id = t.forum_id 
WHERE  f.cat_id = c.id 
GROUP BY c.id, 
                 f.forum_id 
") or die(mysql_error());
?>

geeft mij het volgende weer bij de volgende gegevens
forum 1: topics 5, posts 10
forum 2: topics 3, posts 7
weergave is dan:
forum 1: topics 5, posts 17
forum 2: topics 3, posts 17
dus topics wordt al geteld, nu posts nog.
als ik een RIGHT JOIN posts on t.topic_id = p.topic_id
staat die er maar voor joker bij

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

code:
1
2
3
4
5
6
7
8
9
SELECT count(DISTINCT p.post_id) as total_posts, 
       count( DISTINCT t.topic_id) as total_topics, 
       c.*, 
       f.* 
FROM   forums f 
INNER JOIN cat c ON f.cat_id = c.id
LEFT JOIN topics t ON f.forum_id = t.forum_id, 
LEFT JOIN posts p ON t.topic_id = p.topic_id
GROUP BY c.id,  f.forum_id

Verwijderd

Topicstarter
die hier boven werkt, robjanssen echt bedankt man. ik heb 3 dagen zitten puzzelen.

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Geen dank man

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

drm

f0pc0dert

zoek even op "joins explained" op google. Daar is best wel wat over te vinden, en als je eenmaal begrijpt hoe die joins in elkaar zitten, hoef je zoiets nooit meer te vragen :)

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


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Even voor de duidelijkheid UltraV. Ik geef je hint om het met outerjoins te doen.
Zoals je kan zien in de oplossing robjanssen doet hij precies dat.
Deze oplossing had jij ook kunnen bedenken met mijn hint.
Jammer dat je een uitgewerkt statement nodig hebt. Als je ipv 3 dagen puzzelen 3 dagen over joins had gelezen, was je nu een stuk slimmer geweest.

Ik wil robjanssen dan ook vragen om in het vervolg vooral hints te geven en niet de oplossing te geven.

* Goodielover is vroeger docent geweest, kan het ook niet helpen
Pagina: 1