MySQL запрос WHERE оператор, который сам запрос?

0

Итак, я сначала попытаюсь четко объяснить свою цель:

Во-первых, я хочу запросить одну таблицу в моей базе данных для списка имен пользователей.

Во-вторых, я хочу взять эти имена пользователей и запросить другую таблицу в базе данных и вернуть только строки, в которых эти имена пользователей отображаются в поле имени пользователя.

Наконец, я хочу взять этот вывод (в форме массива JSON прямо сейчас) и вернуть его запрашивающему клиенту.

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

$query = mysql_query("SELECT * FROM tagusers WHERE username = 
    (SELECT userA FROM friendtable WHERE userB = '$username')");

Это работает, когда оператор WHERE дает 1 результат. Поэтому, если я получаю только один возвращенный userA, он отлично работает. Но если я получаю несколько, я получаю кучу ошибок.

Вот код целиком:

if (isset($_POST['username'])) {
$username = $_POST['username'];


$connect = mysql_connect("localhost", "root", "");
mysql_select_db("TagDB");

$query = mysql_query("SELECT * FROM tagusers WHERE username = 
    (SELECT userA FROM friendtable WHERE userB = '$username')");

    }

while ($e = mysql_fetch_assoc($query)) {
    $output[] = $e;
}

$output = json_encode($output);

print $output;

Я получаю следующую ошибку в строке запроса:

* Предупреждение: mysql_query() [function.mysql-query]: Не удается сохранить набор результатов в C:\wamp\www\tag\appgetfriendinfo.php в строке 21 *

Так что мне действительно нужно знать, как бы написать этот запрос в MySQL, чтобы получить массив строк?

  • 0
    Вы пробовали ГДЕ имя пользователя IN (...)
Теги:

3 ответа

5
Лучший ответ

Вам вообще не нужен подзапрос, вы обычно получаете лучшую производительность из соединения. Убедитесь, что у вас есть индексы, определенные на tagusers.username, friendtable.userA и friendtable.userB

SELECT
  tagusers.*
FROM
  tagusers
INNER JOIN
  friendtable  
ON
  tagusers.username = friendtable.userA
AND
  friendtable.userB = '$username'
  • 0
    Даже не думал о ВНУТРЕННЕМ СОЕДИНЕНИИ. Это даст лучшую производительность, чем мое решение. +1 для вас.
  • 1
    Предложение Рэндольфа сработало, но я собираюсь попробовать это тоже для хорошей меры. РЕДАКТИРОВАТЬ: не видел, что Рэндольф одобряет это. Я позабочусь о том, чтобы это сработало, и дам вам зеленый чек, если так. Хотя вы оба получили голос, спасибо огромное! EDIT2: Да, это работает! Большое спасибо вам обоим.
Показать ещё 1 комментарий
2

Используйте ключевое слово IN.

$query = mysql_query("SELECT * FROM tagusers WHERE username IN 
    (SELECT userA FROM friendtable WHERE userB = '$username')");
  • 0
    Спасибо, я попробую.
  • 0
    Попробуйте идею @ Dan тоже. ВНУТРЕННЕЕ СОЕДИНЕНИЕ будет работать лучше (при условии, что все ваши индексы хороши!).
1

Используйте либо предложение IN, либо JOIN, как в этом примере:

$query = sprintf("SELECT tu.* 
                    FROM TAGUSERS tu 
                    JOIN FRIENDTABLE ft ON ft.usera = tu.username
                   WHERE ft.userB = '%s'",
                  mysql_real_escape_string($_POST['username']));

$result = mysql_query($query);

$output = json_encode($result);
Сообщество Overcoder
Наверх
Меню