PDA

View Full Version : query with left join and grouping.


harmor19
04-15-2007, 11:06 AM
I have two tables, "custom_droplinks_cat" and "custom_droplinks".
Below is the tables' layout. I hope it is easy to understand.


----------------------------------------
| Table: custom_droplinks_cat
----------------------------------------
| catid: 1
| title: Test Category 1
----------------------------------------
| catid: 2
| title: Test Category 2
----------------------------------------

----------------------------------------
| Table: custom_droplinks
----------------------------------------
| linkid: 1
| title: Test Link 1
| catid: 1
----------------------------------------
| linkid: 2
| title: Test Link 2
| catid: 1
----------------------------------------
| linkid: 3
| title: Test Link 4
| catid: 2
----------------------------------------
| linkid: 4
| title: Test Link 4
| catid: 2
----------------------------------------




I don't want to ask more than I need to so I'll just ask "How do I make "Test Category" bold then place "Test Link" immediately after followed by a break (br />)?


$getdroplinks_cat = $db->query_read("SELECT
droplink_cat.catid as dlc_catid,
droplink_cat.title as dlc_title,
droplink.catid as dl_catid,
droplink.title as dl_title,

FROM " . TABLE_PREFIX . "custom_droplinks_cat AS droplink_cat
LEFT JOIN " . TABLE_PREFIX . "custom_droplinks AS droplink ON (droplink_cat.catid=droplink.catid)
WHERE droplink_cat.catid = droplink.catid ");
while($dlink = $db->fetch_array($getdroplinks_cat))
{
echo "<b>".$dlink['dlc_title']."</b><br />
".$dlink['dl_title']."<br /><br />";
}




I want the result to be

Test Category 1
Test Link 1
Test Link 2

Test Category 2
Test Link 3
Test Link 4

Marco van Herwaarden
04-15-2007, 12:24 PM
A basic example on how you could do this:
$last_cat = null;
while (my loop conditions)
{
if ($last_cat != $current_cat)
{
$last_cat = $current_cat;
echo "my nice bold line with the category";
}
echo "and my link";
}

harmor19
04-15-2007, 12:33 PM
Thanks for answering my question. I'm going to try it out soon.

harmor19
04-17-2007, 01:38 PM
I thought I could apply the solution Marco gave me to the real query but I can't get it to work.

Here is the actual code

<template name="custom_droplinks" templatetype="template" date="1176624912" username="harmor" version="1.6.0"><![CDATA[<div class="vbmenu_popup" id="adv$dlink[dlc_catid]menu_menu" style="display:none">
<table cellpadding="4" cellspacing="1" border="0">
<tr><td class="thead">$dlink[title]</td></tr>
$custom_droplinks_bit
</table>
</div>]]></template>
<template name="custom_droplinks_cat" templatetype="template" date="1176624827" username="harmor" version="1.6.0"><![CDATA[<td id="adv$dlink[dlc_catid]menu" class="vbmenu_control">
<a href="#">$dlink[title]</a>
<script type="text/javascript">
vbmenu_register("adv$dlink[dlc_catid]menu");
</script>
</td>
]]></template>


<plugin active="1" executionorder="5">
<title>Custom Links</title>
<hookname>global_start</hookname>
<phpcode><![CDATA[

$last_cat = '0';
$getdroplinks_cat = $db->query_read("SELECT
droplink_cat.catid as dlc_catid,
droplink.catid as dl_catid,
droplink.new_window,
droplink.link_perms,
droplink.name,
droplink.image,
droplink.url,
droplink.alt,
droplink.number,
droplink_cat.title,
droplink_cat.permissions,
droplink_cat.display

FROM " . TABLE_PREFIX . "custom_droplinks_cat AS droplink_cat
LEFT JOIN " . TABLE_PREFIX . "custom_droplinks AS droplink ON (droplink_cat.catid=droplink.catid)
ORDER BY dl_catid ASC ");
while($dlink = $db->fetch_array($getdroplinks_cat))
{

eval('$custom_droplinks_cat .= "' . fetch_template('custom_droplinks_cat') . '";');

$custom_droplinks_bit .= "<tr><td class='vbmenu_option'>$img<a href='".$dlink['url']."' target='$new' title='".$dlink['alt']."'>".$dlink['name']."</a></td></tr>";

eval('$custom_droplinks = "' . fetch_template('custom_droplinks') . '";');

}

Marco van Herwaarden
04-17-2007, 03:52 PM
Please post the actually code, i don't want to go decode your XML.
Also telling what is not working might also help.

harmor19
04-20-2007, 05:12 PM
In the screenshot "Test1" is supposed to have "vBulletin" and "Test2" is supposed to have "Xen Web".

I'm not sure if this code snippet will suffice but I don't want to post all the code as it may be overwhelming.

if($last_cat != $dlink['dlc_catid'])
{
$last_cat = $dlink['dlc_catid'];
eval('$custom_droplinks_cat .= "' . fetch_template('custom_droplinks_cat') . '";');
}


$custom_droplinks_bit .= "<tr><td class='vbmenu_option'>$img<a href='".$dlink['url']."' target='$new' title='".$dlink['alt']."'>".$dlink['name']."</a></td></tr>";


Edit: I think I may have to do two separate queries.

harmor19
04-20-2007, 05:43 PM
I figured out the mistake and I fixed it.
Thanks Marco for atleast making an effort to help.

I ran into another problem but I got it situated.
I'm posting the working code here for two reasons. One is if I lose the code and the other is for other people to look at.
I wanted to use "left join" but the query got to be too complicated for me.


$last_cat = '0';
$getdroplinks_cat = $db->query_read("SELECT *
FROM " . TABLE_PREFIX . "custom_droplinks_cat ORDER BY catid");
while($dlink = $db->fetch_array($getdroplinks_cat))
{

$dlink['permissions'] = explode(",", $dlink['permissions']);

if($last_cat != $dlink['catid'])
{
if(in_array($vbulletin->userinfo['usergroupid'], $dlink['permissions']) )
{
eval('$custom_droplinks_cat .= "' . fetch_template('custom_droplinks_cat') . '";');
}

}

$custom_droplinks_bit .= "<div class='vbmenu_popup' id='adv$dlink[catid]menu_menu' style='display:none'>
<table cellpadding='4' cellspacing='1' border='0'>
<tr><td class='thead'>".$dlink['title']."</td></tr>";

$getdroplink_bits = $db->query_read("SELECT * FROM " . TABLE_PREFIX . "custom_droplinks WHERE catid = '$dlink[catid]' ");
while($droplink_bits = $db->fetch_array($getdroplink_bits))
{

if($droplink_bits['new_window'] == 1)
{
$new = "_blank";
}
else
{
$new = "";
}

if(!empty($droplink_bits['image']))
{
$img = "<img src='".$droplink_bits['image']."' width='16' height='16' />";
}
else
{
$img = "";
}



$droplink_bits['link_perms'] = explode(",", $droplink_bits['link_perms']);


if(in_array($vbulletin->userinfo['usergroupid'], $droplink_bits['link_perms']) )
{
$custom_droplinks_bit .=
"<tr><td class='vbmenu_option'>$img<a href='".$droplink_bits['url']."' target='$new' title='".$droplink_bits['alt']."'>".$droplink_bits['name']."</a></td></tr>";
}


}

$custom_droplinks_bit .= "</table></div>";

eval('$custom_droplinks = "' . fetch_template('custom_droplinks') . '";');

$last_cat = $dlink['catid'];

}