Re: Sorting table columns dynamically on normalized MySQL tables [LONG]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Jay,

Tuesday, April 19, 2005, 1:28:25 PM, you wrote:
J> Normalization has no effect on sort order where any DB is concerned.
J> Sort order is determined in the sort clause in the query. So if you want
J> to sort by location and you are using MySQL  your ORDER BY clause should
J> be location....(regardless of joins)

J> SELECT foo
J> FROM bar
J> ORDER BY location

J> returns

J> course           instructor   location
J> Science          Bill         Elementary School
J> Basket Weaving   Dave         High School
J> Math             Dave         Middle School
J> Biology          Jessica      Middle School


Maybe I wasn't clear.

SELECT *
FROM Course
ORDER BY locationID ASC

Now the ORDER BY can be any one of five things based on the variable
passed by the hyperlink for the column they clicked on (location,
course, date, category, and instructor

Because locationID is an integer which directly relates to the
Instructors table id field (also an integer), there is no way in heck
that it can sort that any other way than numerically. There is no join
between the Course, Locations, and Instructors tables. All the Course
table knows is that there is an integer in the instructorID,
categoryID, and locationID field. Therefore it gets sorted
numerically, not alphabetically.

As I said, I was trying to keep the example simple. I actually have
the following tables in the DB.

Courses
Instructors
Locations
Categories
Students
Registrations
Supervisors

Courses contains information pertinent to a course.
 - id
 - name
 - courseDate
 - courseTime
 - ampm (morning or afternoon)
 - capacity (number of seats available)
 - locationID (corresponding id from the Locations table)
 - instructorID (corresponding id from the Instructors table)
 - seatsLeft (counter for the number of available seats)
 - description (what the course is about)
 - categoryID (corresponding id from the Categories table)

Instructors
 - id
 - firstName
 - lastName
 - email
 - phone
 - image
 - about

Locations
 - id
 - name
 - seatingCapacity (How many true seats there are in the room)
 - address
 - directions

Categories
 - id
 - name

Students
 - id
 - firstName
 - lastName
 - email
 - phone
 - password
 - username
 - divisionOrFacility
 - programArea
 - supervisorID

Supervisors
 - id
 - firstName
 - lastName
 - email
 - phone

Registrations
 - id
 - courseID
 - studentID
 - attended

So... For me to list the upcoming courses on the main page, I have the
following column in the table:

Course Name       - From Course Table
Open Seats        - From Course Table
Category          - From Course Table (match id in Categories table)
Date              - From Course Table
Time              - From Course Table
Location          - From Course Table (match id in Locations table)
Instructor        - From Course Table (match id in Instructors table)

Category, Location, and Instructor are integers. What I did to get the
names respective to the integer value is that beforehand I built an
array for those three tables then I match the id from the Course Table
for each of the three with their respective array, and then display
the name.

Since the SELECT statement is based on the Course table, and the
Course table contains only integers, it's sorting by the integer value
of the categoryID, instructorID, or locationID in the Course table.

The actual SELECT statement is as follows:

$sqlCourses="SELECT * FROM " . $tbl_courses . " WHERE courseDate > '" . date("Y-m-d") . "' ORDER BY " . $orderBy . " ASC";

the $orderBy variable is set via $_GET['orderBy'] which is sent by the
table headers as below:

$tblHeaders = '<th><a href="' . $_SERVER['PHP_SELF'] . '?orderBy=name">Course</a></th><th>Open Seats</th><th><a href="' . $_SERVER['PHP_SELF'] . '?orderBy=categoryId">Category</a></th><th><a href="' . $_SERVER['PHP_SELF'] . '?orderBy=courseDate">Date</a></th><th>Time</th><th><a href="' . $_SERVER['PHP_SELF'] . '?orderBy=roomId">Location</a></th><th><a href="' . $_SERVER['PHP_SELF'] . '?orderBy=instructorId">Instructor</a></th>';

The sorting works just fine, but it's numerical ASC based off the
integer value (instructorID, categoryID, or locationID). It is *not*
alphabetical, which is what the customer wants.

If they sort by Location, the location column should be alphabetical
ASC, if by course name, then alphabetical ASC by the course name.

Is that a bit clearer now?

Sorry that this has degenerated into a MySQL question rather than PHP.
I was originally looking for how people handled it in PHP.

BTW, just for clarity sake on the arrays used to build the lookups to
display the list of courses, I'm doing an include with the following:

****************************************************************************

<?php


//Get instructors --------------------------------------------------------------
$sqlInstructors="SELECT * FROM " . $tbl_instructors;
$resultInstructors=mysql_query($sqlInstructors) or die('Failed to get instructors. Please contact ' . $maintainer);

while ($rInstructors=mysql_fetch_assoc($resultInstructors))
{
  $arrInstructors[$rInstructors['id']][name]  = $rInstructors['firstName'] . " " . $rInstructors['lastName'];
  $arrInstructors[$rInstructors['id']][email] = $rInstructors['email'];
  $arrInstructors[$rInstructors['id']][phone] = $rInstructors['phone'];
}
//------------------------------------------------------------------------------

//Get training locations -------------------------------------------------------
$sqlRooms="SELECT * FROM " . $tbl_rooms;
$resultRooms=mysql_query($sqlRooms) or die('Failed to get rooms. Please contact ' . $maintainer);

while ($rRooms=mysql_fetch_assoc($resultRooms))
{
  $arrRooms[$rRooms['id']][name]            = $rRooms['name'];
  $arrRooms[$rRooms['id']][address]         = $rRooms['address'];
  $arrRooms[$rRooms['id']][seatingCapacity] = $rRooms['seatingCapacity'];
}
//------------------------------------------------------------------------------

//Get Categories ---------------------------------------------------------------
$sqlCategories="SELECT * FROM " . $tbl_category;
$resultCategories=mysql_query($sqlCategories) or die('Failed to get categories. Please contact ' . $maintainer);

while ($rCategories=mysql_fetch_assoc($resultCategories))
{
  $arrCategories[$rCategories['id']][name]   = $rCategories['name'];
}
//------------------------------------------------------------------------------

?>


****************************************************************************

Which I then use in the listing while loop for Course table records as
follows:

****************************************************************************

    echo '<td>' . $arrCategories[$rCourses['categoryId']]['name'] . '</td>';
    echo '<td><a href="view_location.php?id=' . $rCourses['roomId'] . '"
             title="Location Information">' .
          $arrRooms[$rCourses['roomId']]['name'] . '</a></td>';
    echo '<td><a href="view_instructor.php?id=' . $rCourses['instructorId'] . '"
             title="Instructor Information">' .
          $arrInstructors[$rCourses['instructorId']]['name'] . '</a></td>';
    echo '</tr>';

****************************************************************************


Basically what happens is that the lookup builder creates an array
like this:

****************************************************************************

Array
(
    [1] => Array
        (
            [name] => Leif Gregory
            [email] => abc@xxxxxxxxxxx
            [phone] => 505-123-4567
        )

    [2] => Array
        (
            [name] => Jenny Craig
            [email] => jcraig@xxxxxxxxxxx
            [phone] => 505-222-2222
        )

    [6] => Array
        (
            [name] => Billy horton
            [email] => billy@xxxxxxxxxxx
            [phone] => 505-839-1234
        )


****************************************************************************

So. $arrInstructors[$rCourses['instructorId']]['name']

If the instructorId from the Course table was '2', then the above
would give me: "Jenny Craig".

You can probably figure that out yourself, but I'm trying to make sure
everyone completely understands what's going on.

Thanks.


-- 
Leif (TB lists moderator and fellow end user).

Using The Bat! 3.0.9.17 Return under Windows XP 5.1
Build 2600 Service Pack 2 on a Pentium 4 2GHz with 512MB

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux