webForumDet fria alternativet

Hämta från 3 olika tabeller join

Databaser & SQLur Databashanterare & SQL

5 svar · 2 386 visningar · startad av spc

spcMedlem sedan nov. 20119 inlägg
#1

hejsan.

detta med join kommer jag nog alldrig att lära mig...
Försöker hämta info från 3 olika tabeller...

$sql = "SELECT 
         categories.cat_id, 
         categories.cat_name, 
         categories.cat_description, 
         categories.cat_group, 
         categories.cat_order, 
         COUNT(topics.topic_id) AS topics, 
         topics.topic_by, 
         users.username 
      FROM 
         categories 
      JOIN 
         topics 
      ON 
         topics.topic_id = categories.cat_id 
      LEFT JOIN 
         users    
      ON 
         topics.topic_by = users.username 
      GROUP BY 
         categories.cat_name, categories.cat_description, categories.cat_id, categories.cat_order";

när någon medlem lägger till en tråd så sparas dens id i topics.topic_by
men isället för att få en 2 där, så skulle jag vilja att när den har hämtat ut 2 så blir det users_username.....

Hoppas någon förstår hur jag menar...

LarsGMedlem sedan dec. 200012 464 inlägg
#2
ON 
         topics.topic_by = users.username

är ett konstigt villkor då topic_by är en numerisk kolumn och username är character. Förmodligen så vill du jämföra med motsvarande id-kolumn i users.

I din fråga vill du räkna antal inlägg i olika kategorier, då förstår jag inte vad syftet är med att hämta username då du får en post per kategori.

T.ex. säg att det finns tre inlägg i en kategori, skrivna av tre olika användare. Vilket username vill du ha? Alla? Ett slumpmässigt? Den som har skrivit flest inlägg i den kategorin?

spcMedlem sedan nov. 20119 inlägg
#3

hejsan...

Du det har jag nog inte tänkt på....vad skulle du gjort ???
tror att på första sidan forum.php så vill jag nog ha den som skrivit den sista inlägget.

bifogar koden på forum.php

<?php
//create_cat.php
include 'conn.php';

$sql = "SELECT
        categories.cat_id, 
        categories.cat_name, 
        categories.cat_description, 
        categories.cat_group, 
        categories.cat_order, 
        COUNT(topics.topic_id) AS topics, 
        topics.topic_by, 
        users.username 
    FROM 
		categories 
    JOIN 
		topics 
	ON 
		topics.topic_id = categories.cat_id 
    INNER JOIN 
		users 
	ON 
		users.id = topics.topic_by 
    GROUP BY 
		categories.cat_name, categories.cat_description, categories.cat_id"; 
 

$result = mysql_query($sql)or die(mysql_error());
$headline = '';

		while($row = mysql_fetch_assoc($result))
		{				
		if ($headline != $row['cat_group'])
   {
   		//prepare the table
	echo '<div class="home-header"><div class="heading ico-groups">' . $row['cat_group'] . '
			</div>
	        </div>
	        <table border="0" cellspacing="0" cellpadding="3" class="tableCurves" width="100%">
	        <tr>
	        <td><table border="0" cellSpacing="1" cellPadding="4" width="100%">';
	
	echo '<tr>
		  <td vAlign="top" align="middle" width="3%"><img id="mark_read_121" src="img/topic_icon_on.png" width="22" height="22"></td>';
	echo '<td vAlign="top" width="53%"><b><a href="category.php?id=' . $row['cat_id'] . '">' . $row['cat_name'] . '</a></b><br>' . $row['cat_description'] . '</td>
		  <td nowrap" vAlign="top" align="middle" width="8%">' . $row['topics'] . '</td>
		  <td nowrap" vAlign="top" align="middle" width="8%">-</td>
		  <td vAlign="top" align="right" width="19%"><div style="TEXT-ALIGN: center">' . $row['username'] . ' <br>';
				
			//fetch last topic for each cat
					$topicsql = "SELECT
									topic_id,
									topic_subject,
									topic_date,
									topic_cat
								FROM
									topics
								WHERE
									topic_cat = " . $row['cat_id'] . "
								ORDER BY
									topic_date
								DESC
								LIMIT
									1";
								
					$topicsresult = mysql_query($topicsql)or die(mysql_error());
				
					if(!$topicsresult)
					{
						echo 'Last topic could not be displayed.';
					}
					else
					{
						if(mysql_num_rows($topicsresult) == 0)
						{
							echo 'Inga ämnen';
						}
						else
						{
							while($topicrow = mysql_fetch_assoc($topicsresult))
							echo '<a href="topic.php?id=' . $topicrow['topic_id'] . '"> ' . date('j F, Y, g:i', strtotime($topicrow['topic_date']));
						}
					}
				echo '</div></td></tr>';
				echo '<tr>
		<td class="trow1" vAlign="top" align="middle" colspan="5"><div style="border-bottom:1px dotted #94B1DF; margin-bottom:5px; padding:0px 0px 5px 0px; clear:both;"></div></td>
	  </tr>
	  </table>
	  </td></tr>'; 
}
echo '</table>';
}
mysql_free_result($result);
?>
</div>

den vill inte lista ut alla cat_id, fattar inte varför den inte gör det....
har du någon ide ????

1.JPG
LarsGMedlem sedan dec. 200012 464 inlägg
#4

Om du inte får ut alla kategorier så beror det förmodligen på att det inte finns poster i topics för alla. Du får byta ut inner join och mot left join

  from categories
  left
  join topics 
    on topics.topic_id = categories.cat_id 
  left
  join users 
    on users.id = topics.topic_by
spcMedlem sedan nov. 20119 inlägg
#5

Ändrat om select nu lite gran, så nu har jag 13st cat_id..

Har något fel på själva tabellen som listar ut allt.
På den bifogade filen ser man hur jag skulle vilja få till den...

nya koden:

<?php
$sql = "SELECT
  cat_id AS id,
  cat_name AS name, 
  cat_description AS description, 
  cat_order,
  cat_group AS groupname
FROM
  categories
ORDER BY
  cat_id, cat_order";		
			
$result = mysql_query($sql)or die(mysql_error());

$headline = '';
		while($row = mysql_fetch_assoc($result))
		{				
		if ($headline != $row['groupname'])
   {
	echo '<div class="home-header"><div class="heading ico-groups">' . $row['groupname'] . '
			</div>
	        </div>';
	    $headline = $row['groupname'];	  
   }
	echo '<table border="0" cellspacing="0" cellpadding="3" class="tableCurves" width="100%">
	        <tr>
	        <td>';
				
	echo '<table border="0" cellspacing="1" cellpadding="4" width="100%">
		  <tr>
		  <td valign="top" align="center" width="3%"><img src="img/topic_icon_on.png" width="22" height="22" alt="" /></td>';
	echo '<td valign="top" width="53%"><b><a href="category.php?id=' . $row['id'] . '">' . $row['name'] . '</a></b><br />' . $row['description'] . '</td>';
	
			//fetch last topic for each cat
$topicsql = "SELECT 
	u.username AS username,
	u.id AS userid,
	t.topic_id AS topic_id,
	t.topic_date AS topic_date,
	t.topic_cat AS topic_cat
FROM
	(SELECT
	topic_by AS userid,
	topic_id AS topic_id,
	topic_date AS topic_date,
	topic_cat AS topic_cat
FROM 
	topics
WHERE
	topic_cat = " . $row['id'] . "
ORDER BY 
	topic_id, topic_date DESC
	LIMIT 1) AS t
JOIN
	users AS u
ON 
	u.id = t.userid";			
					$topicsresult = mysql_query($topicsql)or die(mysql_error());
				
					if(!$topicsresult)
					{
						echo 'Last topic could not be displayed.';
					}
					else
					{	
						if(mysql_num_rows($topicsresult) == 0)
						{
							echo '<td valign="top" align="center" width="8%"></td>';
							echo '<td valign="top" align="center" width="8%">-</td>
		                          <td valign="top" align="center" width="19%">';
							echo 'Inga &auml;mnen';
						}
						else
						{
							while($topicrow = mysql_fetch_assoc($topicsresult))
							{
							echo '<td valign="top" align="center" width="8%">' 
							. mysql_result(mysql_query("SELECT COUNT(*) FROM topics WHERE topic_cat=" . $row['id']), 0, 0) 
							. '</td>';
							
							echo '<td valign="top" align="center" width="8%">-</td>
		                          <td valign="top" align="center" width="19%">' . $topicrow['username'] . '<br />';
							echo '<a href="topic.php?id=' . $topicrow['topic_id'] . '"> ' . date('j F, Y, g:i', strtotime($topicrow['topic_date']));
							echo '</a>';
							}
						}
					}
				echo '</td></tr>';
				echo '<tr>
		<td class="trow1" valign="top" align="center" colspan="5"><div style="border-bottom:1px dotted #94B1DF; margin-bottom:5px; padding:0px 0px 5px 0px; clear:both;"></div></td>
	  </tr>
	  </table>
	  </td></tr></table>'; 
}
mysql_free_result($result);
?>
1.JPG
spcMedlem sedan nov. 20119 inlägg
#6

lyckats få dom precis som jag vill ha dom, MEN !!!!
Under kategorierna under varje huvudrubrik ligger inte innom samma ram.
+ att det ska vara ett mellanrum från den sista under kategori till nästa huvudrubrik.

Där har jag problemet nu...

Hoppas verkligen någon kan hjälpa mig med detta....

koden är :

<?php
$sql = "SELECT
  cat_id AS id,
  cat_name AS name, 
  cat_description AS description, 
  cat_order,
  cat_group AS groupname
FROM
  categories
ORDER BY
  cat_id, cat_order";		
			
$result = mysql_query($sql)or die(mysql_error());

$headline = '';
		while($row = mysql_fetch_assoc($result))
		{				
		if ($headline != $row['groupname'])
   {
	echo '<div class="home-header"><div class="heading ico-groups">' . $row['groupname'] . '
			</div></div>';	  
   }
	echo '<table border="0" cellspacing="0" cellpadding="3" class="tableCurves" width="100%">
	        <tr>
	        <td>';
				
	echo '<table border="0" cellspacing="1" cellpadding="4" width="100%">
		  <tr>
		  <td valign="top" align="center" width="3%"><img src="img/topic_icon_on.png" width="22" height="22" alt="" /></td>';
	echo '<td valign="top" width="53%"><b><a href="category.php?id=' . $row['id'] . '">' . $row['name'] . '</a></b><br />' . $row['description'] . '</td>';
	
			//fetch last topic for each cat
$topicsql = "SELECT 
	u.username AS username,
	u.id AS userid,
	t.topic_id AS topic_id,
	t.topic_date AS topic_date,
	t.topic_cat AS topic_cat
FROM
	(SELECT
	topic_by AS userid,
	topic_id AS topic_id,
	topic_date AS topic_date,
	topic_cat AS topic_cat
FROM 
	topics
WHERE
	topic_cat = " . $row['id'] . "
ORDER BY 
	topic_id, topic_date DESC
	LIMIT 1) AS t
JOIN
	users AS u
ON 
	u.id = t.userid";			
					$topicsresult = mysql_query($topicsql)or die(mysql_error());
				
					if(!$topicsresult)
					{
						echo 'Last topic could not be displayed.';
					}
					else
					{	
						if(mysql_num_rows($topicsresult) == 0)
						{
							echo '<td valign="top" align="center" width="8%"></td>';
							echo '<td valign="top" align="center" width="8%">-</td>
		                          <td valign="top" align="center" width="19%">';
							echo 'Inga &auml;mnen';
						}
						else
						{
							while($topicrow = mysql_fetch_assoc($topicsresult))
							{
							echo '<td valign="top" align="center" width="8%">' 
							. mysql_result(mysql_query("SELECT COUNT(*) FROM topics WHERE topic_cat=" . $row['id']), 0, 0) 
							. '</td>';
							echo '<td valign="top" align="center" width="8%">-</td>
		                          <td valign="top" align="center" width="19%">' . $topicrow['username'] . '<br />';
							echo '<a href="topic.php?id=' . $topicrow['topic_id'] . '"> ' . date('j F, Y, g:i', strtotime($topicrow['topic_date']));
							echo '</a></td>';
							echo '</tr>';
							}
						}
					}
				echo '<tr>
		<td class="trow1" valign="top" align="center" colspan="5"><div style="border-bottom:1px dotted #94B1DF; margin-bottom:5px; padding:0px 0px 5px 0px; clear:both;"></div></td>
	  </tr>
	  </table>
	  </td></tr></table>'; 
}
?>
151 ms totalt · 3 externa anrop · v20260731065814-full.c74b5be1
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
148 ms — hämta tråd, inlägg och bilagor (db)