Put the value of the venue out when it changes. Something like this:-
<?php
$eid = $_GET['event_id'];
$q = "SELECT e.event_name, e.event_description, i.venue_id, i.venue_name, i.instance_avail, DATE_FORMAT( i.instance_date, '%M %D, %Y' ) AS DATE
FROM events AS e
INNER JOIN instance AS i ON e.event_id = i.event_id
WHERE e.event_id = $eid
ORDER BY i.venue_id, i.instance_date";
$cur_venue = 0;
$r = @mysqli_query ($dbc,$q);
if ($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
{
$cur_venue = $row['venue_id'];
echo $row['event_name']."<br />";
echo $row['venue_name']."<br />";
echo $row['DATE']."<br />";
while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
{
if ($cur_venue != $row['venue_id'])
{
$cur_venue = $row['venue_id'];
echo $row['venue_name']."<br />";
}
echo $row['DATE']."<br />";
}
}
?>
Possibly clean it up using a do...while loop:-
<?php
$eid = $_GET['event_id'];
$q = "SELECT e.event_name, e.event_description, i.venue_id, i.venue_name, i.instance_avail, DATE_FORMAT( i.instance_date, '%M %D, %Y' ) AS DATE
FROM events AS e
INNER JOIN instance AS i ON e.event_id = i.event_id
WHERE e.event_id = $eid
ORDER BY i.venue_id, i.instance_date";
$cur_venue = 0;
$r = @mysqli_query ($dbc,$q);
if ($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
{
echo $row['event_name']."<br />";
do
{
if ($cur_venue != $row['venue_id'])
{
$cur_venue = $row['venue_id'];
echo $row['venue_name']."<br />";
}
echo $row['DATE']."<br />";
} while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC));
}
?>
EDIT - Had a play with the test data and the below appears to work.
<?php
#------ database connections -------
define('MYSQLHOST','localhost');
define('MYSQLUSER','');
define('MYSQLPASS','');
define('MYSQLDATABASE','test');
define('MYSQLDATABASE_INTERNAL', '');// sf orders database
$dbc = mysqli_connect(MYSQLHOST, MYSQLUSER, MYSQLPASS, MYSQLDATABASE);
$eid = $_GET['course_id'];
$q = "SELECT e.course_name, e.course_description, i.venue_id, v.venue_name, i.instance_avail, DATE_FORMAT( i.instance_date, '%M %D, %Y' ) AS DATE
FROM courses AS e
INNER JOIN instance AS i ON e.course_id = i.event_id
INNER JOIN venue AS v ON i.venue_id = v.venue_id
WHERE e.course_id = $eid
ORDER BY i.venue_id, i.instance_date";
$cur_venue = 0;
$r = @mysqli_query ($dbc,$q) or die(mysqli_error($dbc));
if ($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
{
echo $row['course_name']."<br />";
do
{
if ($cur_venue != $row['venue_id'])
{
$cur_venue = $row['venue_id'];
echo $row['venue_name']."<br />";
}
echo $row['DATE']."<br />";
} while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC));
}
?>
ORDER BYcityname, you can keep the query. While looping over all your entries, check if the cityname is the same as the cityname of the last iteration. If i understand your question correctly at least :S