Оставить соединение, внутреннее соединение, присоединиться что-нибудь?

0

Я делаю два запроса, чтобы получить значение. По-моему, было бы быстрее. Я думаю, что лучший способ - использовать соединение. Это мой код:

$uid = db_query("SELECT uid FROM TABLE1 WHERE mail = '{$account->mail}' LIMIT 1");
$row = mysql_fetch_array($uid);
$uid = $row[0];


$brief = db_query("SELECT value FROM Table2 WHERE uid = '{$uid}' AND fid = '16' LIMIT 1");
$row = mysql_fetch_array($brief);
$brief = $row[0];`

Как я могу объединить эти два запроса в один?

Большое спасибо в Advance!

Теги:

3 ответа

2
    SELECT value, ui
      FROM TABLE1 T1
INNER JOIN Table2 T2
     USING (uid)
     WHERE mail = '{$account->mail}'
       AND fid = 16
     LIMIT 1

Но ваши запросы странные. Является ли uid уникальным? Является ли fid уникальным? В противном случае он будет выбирать "случайную" строку.

В принципе, мой запрос соединяет TABLE1 с Table2 с использованием столбца uid, и он принимает только строки, где mail = $account- > mail и fid = 16. Поэтому, если есть несколько строк, вы не можете быть уверены, один из них будет выбран.

0

Запрос будет выглядеть следующим образом:

SELECT TABLE1.uid,TABLE2.value
FROM TABLE1,TABLE2
WHERE TABLE1.mail = '{$account->mail}'
  AND TABLE2.uid = TABLE1.uid
  AND TABLE2.fid = '16'
LIMIT 1

Схват данных из строки:

$uid = $row[0];
$brief = $row[1];
  • 2
    Это декартово произведение. Переменная $ uid из первого запроса, я думаю, вы хотели написать TABLE2.uid = TABLE1.uid . Но, если честно, я не фанат старого синтаксиса, синтаксис с INNER JOIN (или NATURAL INNER JOIN) гораздо понятнее.
  • 0
    @Vincent Savard: Да, теоретически это декартово произведение, но разве LIMIT 1 не предотвращает это?
Показать ещё 5 комментариев
0

Другие предоставили синтаксис, поэтому я не буду повторять эту часть. Но о том, какой тип соединения использовать:

Чтобы получить в буквальном смысле то, что вы получили бы с вышесказанным, вы должны использовать left join с TABLE1 в качестве первой таблицы в соединении.

В вашем примере вы всегда получаете uid, и вы можете получить value. Левое соединение даст вам тот же результат, что и вы всегда возвращаете результат (uid) из таблицы 1 и строки (value), которые совпадают с таблицей 2. Конечно, при условии, что значение для mail было сопоставлено.

Примечание. Насколько я понимаю, использование LIMIT 1 может замаскировать проблему, если у вас нет уникального ограничения на почтовый столбец. Если в таблице TABLE1 было два ряда с одинаковым значением почты, вы никогда не узнаете об этом с этим запросом. В некоторых случаях это может быть ошибкой в ​​вашей системе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню