За последние 24 часа нас посетили 30479 программистов и 1793 робота. Сейчас ищет 701 программист ...

Выборка из двух таблиц (по мотивам соседнего топика)

Тема в разделе "MySQL", создана пользователем SkyKiller, 22 дек 2010.

  1. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Приветствую всех!

    Есть две таблицы:
    Код (Text):
    1.  
    2. users:
    3. -----+------+------------+
    4. id   | name | bday       |
    5. -----+------+------------+
    6. 1    | alex | 1974-11-04 |
    7. 2    | john | 1977-11-22 |
    8. 3    | mark | 1984-05-14 |
    9. -----+------+------------+
    10.  
    11. users_meta:
    12. -----+---------+----------+---------------+
    13. id   | status  | reason   | del_date      |
    14. -----+---------+----------+---------------+
    15. 1    | active  | NULL     | NULL          |
    16. 2    | deleted | спаммер  | 2010-12-22    |
    17. 3    | active  | NULL     | NULL          |
    18. -----+---------+----------+---------------+
    И есть PHP-функция, которая получает на входе ID пользователя и определяет, активен ли его профиль или он уже удалён.
    Функция проверяет по второй таблице статус (по ID) и действует по логике:
    Если профиль удалён - функция должна сделать выборку из двух таблиц: из первой выбрать имя (по ID), а из второй - дату и причину удаления. Если профиль активен (статус active) - функция должна вернуть FALSE:
    PHP:
    1.  
    2. <?php
    3. function isProfileDeleted($userID) {
    4.     global $lnk;
    5.     $query = "  SELECT `users`.`name`,`users_meta`.`status`, `users_meta`.`reason`, `users_meta`.`del_date`
    6.             FROM `users`,`users_meta`
    7.             WHERE `users`.`id` = ".$userID." AND `users`.`id` = `users_meta`.`id`";
    8.  
    9.     $result = mysql_query($query, $lnk) or die(mysql_error());
    10.     if ($result && mysql_num_rows($result) > 0) {
    11.         $row = mysql_fetch_array($result, MYSQL_ASSOC);
    12.             // Если профиль удалён - получаем дату и причину удаления
    13.             if ( $row['status'] == "deleted" ) {
    14.                 $profileNickName = $row['name'];
    15.                 $profileDeleteReason = $row['reason'];
    16.                 $profileDeleteDate   = $row['del_date'];
    17.                 mysql_free_result($result);
    18.                 return(true);
    19.             }
    20.             // С профилем всё в порядке, выходим
    21.             else {
    22.                 mysql_free_result($result);
    23.                 return(false);
    24.             }
    25.     } else {
    26.         return(false);
    27.     }
    28. }
    29. ?>
    30.  
    В данном примере, при вызове этой функции с ID=2 мы должны получить выборку, состоящую из имени, даты удаления и причины удаления профиля. В остальных случаях - FALSE.

    В принципе, сейчас всё работает. Но меня беспокоит другое: правильно ли я составил запрос? Может, можно было как-то проще сделать? Функция будет вызываться при каждом просмотре профиля (а профилей на сайте - пара десятков тысяч). Не сильно ли эта функция будет грузить сервак с базой?

    Заранее благодарю за ответы и конструктивную критику.
     
  2. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    Можно переписать при помощи LEFt JOIN, но мне кажется результат будет аналогичным. Если в таблицах есть индексы работать будет быстро.