2014-03-11 7 views
0

У меня есть 3 таблицы:MYSQL запрос получения ошибки

MEMBERS: 
+------------+---------+--------+ 
| user | pass | sex | 
+------------+---------+--------+ 
| testuser3 | qwerty | male | 
| testuser4 | qwerty | female | 
| testuser5 | qwerty | male | 
+------------+---------+--------+ 


LIKEPROFILE: 
+------------+---------------+ 
| user  | ilike  | 
+------------+---------------+ 
| testuser3 | testuser4  | 
+------------+---------------+ 

DISLIKEPROFILE: 
+------------+---------------+ 
| user  | dislike  | 
+------------+---------------+ 
| testuser4 | testuser3  | 
+------------+---------------+ 

В моем сайте, скажем testuser3 в настоящее время вошли в систему, то есть $ пользователь = testuser3

Я хотел бы создать запрос MYSQL который включает в себя всех участников, кроме $ user, которые: 1) $ пользователь не «понравился» (например: в таблице likeprofile, testuser3 «понравился» testuser4) и 2) кто $ пользователь не «не любит» (например: в таблица dislikeprofile, testuser4 имеет «не понравился» testuser3). Это то, что у меня есть, но оно порождает эту ошибку: «Операнд должен содержать 1 столбец». Пожалуйста помоги!

$result = queryMysql("SELECT `user` FROM `members` 
        WHERE `user` NOT IN(SELECT * FROM `likeprofile` WHERE user='$user') 
        AND `user` NOT IN(SELECT * FROM `dislikeprofile` WHERE user='$user') 
        AND `user` <> '$user'") 
+1

вы должны использовать не присоединяется subquerries, они будут быстрее –

ответ

1

Во-первых, вы, вероятно, следует убедиться, что вы хеширования паролей перед их сохранением в базе данных, если вы не делаете так уже. Если вы используете PHP 5.5 или выше, вы можете сделать это, используя функцию password_hash().

Что касается вашего запроса, непосредственной проблемой является то, что ваши подзапросы возвращают более одного столбца в своем выборе; SELECT * вернет все столбцы для этой строки, но NOT IN ожидает, что они вернут только один столбец.

$result = queryMysql(
    "SELECT `user` 
    FROM `members` 
    WHERE `user` NOT IN (
     SELECT `ilike` 
     FROM `likeprofile` 
     WHERE user='$user' 
    ) 
    AND `user` NOT IN (
     SELECT `dislike` 
     FROM `dislikeprofile` 
     WHERE user='$user' 
    ) 
    AND `user` <> '$user'" 
); 

Однако подзапросы неэффективны, поэтому лучше использовать ЛЕВАЯ JOINS и запроса NULL результатов для ilike и dislike следующим образом:

$result = queryMysql(
    "SELECT `user` 
    FROM `members` AS `m` 
    LEFT JOIN `likeprofile` AS `lp` 
     ON `m`.`user` = `lp`.`user` 
    LEFT JOIN `dislikeprofile` AS `dp` 
     ON `m`.`user` = `dp`.`user` 
    WHERE `lp`.`ilike` IS NULL 
     AND `dp`.`dislike` IS NULL 
     AND `user` != '$user'" 
); 
0

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

$result = queryMysql("SELECT `user` FROM `members` 
       WHERE `user` NOT IN(SELECT `ilike` FROM `likeprofile` WHERE user='$user') 
       AND `user` NOT IN(SELECT `dislike` FROM `dislikeprofile` WHERE user='$user') 
       AND `user` <> '$user'") 
+1

Даже если вы можете быть верны, вы должны добавить что-то, объясняющее ваш ответ. Ответы только на код, как правило, не очень хорошие. – Mike

Смежные вопросы