superscral
superscral

Reputation: 480

Display Alphabetical order a list of name and surname

I need to display in alphabetical order a list of name and surname (order by surname). The problem is I can't do a ORDER BY in SQL query because I retrieve my users ID in one table and retrieve the informations in another table.

My PHP code:

$sql = "select id FROM $table_name";
$result = $wpdb->get_results($sql);
foreach ($result as $record) {
    $id = $record->id;

    $sql2 = "select field_name, field_val FROM $table_name2 where sub_id = $id";
    $result2 = $wpdb->get_results($sql2);
    foreach ($result2 as $record2) {
        if($record2->field_name == "Nom :") {
            $surname = ucfirst(stripslashes($record2->field_val));
        }
        if($record2->field_name == "Prénom :") {
            $name = ucfirst(stripslashes($record2->field_val));
        }
    }

    echo $name . " " . $surname . "<br/>";
}

Here the architecture of the second table:

f_id    sub_id      field_name      field_val
127     19          Prénom :        Philippe
128     19          Nom :           Nailloux
129     20          Prénom :        John
130     20          Nom :           Drumond

Have you an idea how I can display my list ordered by surname alphabetically?

Thanks.

Upvotes: 0

Views: 362

Answers (2)

Geordie
Geordie

Reputation: 36

You can do the trick by using this SQL query :

SELECT t1.id        AS user_id, 
       t2.field_val AS surname, 
       t3.field_val AS name 
FROM   $table_name t1 
       JOIN $table_name2 AS t2 
         ON ( t2.sub_id = t1.id 
              AND t2.field_name = 'Nom :' ) 
       JOIN $table_name2 AS t3 
         ON ( t3.sub_id = t1.id 
              AND t3.field_name = 'Prénom :' ) 
ORDER  BY t2.field_val 

The query will return all the infos needed (user_id, surname and name) ordered by surname.

Upvotes: 1

ex3v
ex3v

Reputation: 3566

Use subqueries!

In your example, let's say you have 100 users. In first query you get your users ids, then for each user you query database for one's data. That's 101 queries for a simple operation! What if you have 10 visits per seconds? That's more than 1000 queries.

There are many strategies (subquery, join, two queries with in () in second one) but in this case consider that:

SELECT 
  field_name, field_val
FROM
  $table_name2
WHERE
  sub_id IN(
    SELECT 
      id 
    FROM 
      $table_name
  ) as sq1
ORDER BY field_val ASC;

Also consider using PHP PDO, or at least proper escaping of data you put in queries.

Upvotes: 0

Related Questions