Итак, я сначала попытаюсь четко объяснить свою цель:
Во-первых, я хочу запросить одну таблицу в моей базе данных для списка имен пользователей.
Во-вторых, я хочу взять эти имена пользователей и запросить другую таблицу в базе данных и вернуть только строки, в которых эти имена пользователей отображаются в поле имени пользователя.
Наконец, я хочу взять этот вывод (в форме массива 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, чтобы получить массив строк?
Вам вообще не нужен подзапрос, вы обычно получаете лучшую производительность из соединения. Убедитесь, что у вас есть индексы, определенные на tagusers.username, friendtable.userA и friendtable.userB
SELECT
tagusers.*
FROM
tagusers
INNER JOIN
friendtable
ON
tagusers.username = friendtable.userA
AND
friendtable.userB = '$username'
Используйте ключевое слово IN
.
$query = mysql_query("SELECT * FROM tagusers WHERE username IN
(SELECT userA FROM friendtable WHERE userB = '$username')");
Используйте либо предложение 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);