[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: not in по двум столбцам одновременно
lop_atin
Здравствуйте, раньше у меня была задача достать все строки из БД, которые не имели в себе id данного пользователя (которые занесены в другую БД):

`order_like`.`id` not in ((select `order_like_person`.`id_order` from `order_like_person` where `order_like_person`.`id_user` = '$id'))


Но теперь задача усложнилась, мне нужно проверять не только наличие id этого пользователя в другой таблице, а еще и столбец status, который должен равняться тоже $id

ну как-то так:

`order_like`.`id` not in ((select `order_like_person`.`status` from `order_like_person` where `order_like_person`.`id_user` = '$id'))
and
`order_like`.`id` not in ((select `order_like_person`.`id_order` from `order_like_person` where `order_like_person`.`id_user` = '$id'))


такой вариант не проходит, он все-равно отсеивает НУЖНЫЕ строки, то есть ошибка кода в том, что он НЕ проверяет ОДНОВРЕМЕННО по двум полям, а по очереди...

Помогите пожалуйста..
zx-spectr
Пробуйте так:


`order_like`.`id` NOT IN ( SELECT `order_like_person`.`status`
FROM `order_like_person`
WHERE `order_like_person`.`id_user` = '$id'
AND `order_like_person`.`status` = `order_like_person`.`id_user`
)
lop_atin
Цитата (zx-spectr @ 13.09.2013 - 06:34)
Пробуйте так:


`order_like`.`id` NOT IN ( SELECT `order_like_person`.`status`
      FROM `order_like_person`
      WHERE `order_like_person`.`id_user` = '$id'
      AND `order_like_person`.`status` = `order_like_person`.`id_user`
    )

попробовал не работает :(

Попробовал вот так, но тоже не работает:

and `order_like`.`id_post` not in ((select `order_like_person`.`id_post` from
`order_like_person` where `order_like_person`.`id_user` = $id and
`order_like`.`id_user` not in ((select `order_like_person`.`id_first` from
`order_like_person` where `order_like_person`.`id_user` = $id))))
Arh
Не пойму что на чём завязано

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
sergeiss
В Постгре легко делается, где-то примерно так Пострге):

and row( order_like.id_post, order_like.id_user) not in
(select id_post, id_first from order_like_person where id_user = $id )


Но там это возможно потому, что там, в отличие от Мускуля, есть тип данных ROW (и не только он один :)). В Мускуле же можно попробовать сформировать символьную строку из двух (или более) столбцов, и аналогичную строку сформировать внутри условия IN. Тогда можно будет сравнить строки.

Что-нибудь типа (Мускуль)
and concat( `order_like`.`id_post, `order_like`.`id_user`) not in
( select concat(`
id_post`, `id_first`) from `order_like_person` where `id_user` = $id)


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
lop_atin
Цитата (sergeiss @ 13.09.2013 - 21:29)
В Постгре легко делается, где-то примерно так Пострге):

and row( order_like.id_post, order_like.id_user) not in
(select id_post, id_first from order_like_person where id_user = $id )


Но там это возможно потому, что там, в отличие от Мускуля, есть тип данных ROW (и не только он один :)). В Мускуле же можно попробовать сформировать символьную строку из двух (или более) столбцов, и аналогичную строку сформировать внутри условия IN. Тогда можно будет сравнить строки.

Что-нибудь типа (Мускуль)
and concat( `order_like`.`id_post, `order_like`.`id_user`) not in
( select concat(`
id_post`, `id_first`) from `order_like_person` where `id_user` = $id)

твой вариант понравился, но он не работает sad.gif
sergeiss
Цитата (lop_atin @ 13.09.2013 - 23:21)
твой вариант понравился, но он не работает

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

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
S.Chushkin
Цитата (sergeiss @ 13.09.2013 - 21:29)
В Постгре легко делается, где-то примерно так Пострге):

and row( order_like.id_post, order_like.id_user) not in
(select id_post, id_first from order_like_person where id_user = $id )


Но там это возможно потому, что там, в отличие от Мускуля, есть тип данных ROW (и не только он один :)). ...[/sql]

В mySQL работает и так и ещё проще:
and (order_like.id_post, order_like.id_user) not in
(select id_post, id_first from order_like_person where id_user = $id )


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
lop_atin
Цитата (sergeiss @ 13.09.2013 - 23:31)
Цитата (lop_atin @ 13.09.2013 - 23:21)
твой вариант понравился, но он не работает

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



Вот весь запрос твой запрос:

$result_order = mysql_query("select * from `order_like` 
where `order_points` > `put_points` and `id_client` !=
$id and `status` = 0
and ((`country` = '
$country' and `sex` = '$sex')
or (`country` = '
$country' and `sex` = 0)
or (`country` = 0 and `sex` = '
$sex')
or (`country` = 0 and `sex` = 0))
and `order_like`.`id` not in ((select `order_like_person`.`id_order` from `order_like_person` where `order_like_person`.`id_user` =
$id))
and (`order_like`.`id_post, `order_like`.`id_user`) not in
(select (`order_like_person`.`id_post`, `order_like_person`.`id_first`) from `order_like_person` where `order_like_person`.`id_user` =
$id)
ORDER BY RAND() LIMIT 1"
,$db);
$myrow_order = mysql_fetch_assoc($result_order);


Не работает :( Хотя по идеи должен... тут самое главное, чтобы:

 and (`order_like`.`id_post, `order_like`.`id_user`) not in
(select (`order_like_person`.`id_post`, `order_like_person`.`id_first`) from `order_like_person` where `order_like_person`.`id_user` = $id)


одновременно по двум полям проверяло, а не по очереди... если по очереди, то запрос не пройдет, я так понимаю эти строки одновременно проверяют... но тогда хз в чем ошибка...



lop_atin
Цитата (S.Chushkin @ 13.09.2013 - 23:42)
Цитата (sergeiss @ 13.09.2013 - 21:29)
В Постгре легко делается, где-то примерно так Пострге):

<pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">and</span> row<span class="sh_symbol">(</span> order_like<span class="sh_symbol">.</span>id_post<span class="sh_symbol">,</span> order_like<span class="sh_symbol">.</span>id_user<span class="sh_symbol">)</span> <span class="sh_keyword">not in</span>
<span class="sh_symbol">(</span><span class="sh_keyword">select</span> id_post<span class="sh_symbol">,</span> id_first <span class="sh_keyword">from</span> order_like_person <span class="sh_keyword">where</span> id_user <span class="sh_symbol">=</span> $id <span class="sh_symbol">)</span></pre>

Но там это возможно потому, что там, в отличие от Мускуля, есть тип данных ROW (и не только он один :)). ...[/sql]

В mySQL работает и так и ещё проще:
and (order_like.id_post, order_like.id_user) not in
(select id_post, id_first from order_like_person where id_user = $id )

ваш вариант тоже не проходит sad.gif
S.Chushkin
http://dev.mysql.com/doc/refman/5.0/en/row-subqueries.html

Всё должно работать, если есть записи удовлетворяющие условиям отбора.
Удалите все условия, кроме последнего. Если не находит строк, значит их нет по условию выборки. Если есть, значит смотрите остальные условия - где-то там фильтрует.


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
lop_atin
Цитата (S.Chushkin @ 13.09.2013 - 23:54)
http://dev.mysql.com/doc/refman/5.0/en/row-subqueries.html

Всё должно работать, если есть записи удовлетворяющие условиям отбора.
Удалите все условия, кроме последнего. Если не находит строк, значит их нет по условию выборки. Если есть, значит смотрите остальные условия - где-то там фильтрует.

Ваш запрос срабатывает, но он помимо нужных строк находит еще и "не нужные".

Убрал предыдущие фильтры в запросе, так же само все...


Я подккоректировал Ваш запрос следующем образом, он тоже не работает :(

and (`order_like`.`id_post`, `order_like`.`id_user`) not in
(select `order_like_person`.`id_post`, `order_like_person`.`id_first` from `order_like_person` where `id_user` = '$id')
S.Chushkin
Цитата (lop_atin @ 13.09.2013 - 23:59)
Ваш запрос срабатывает, но он помимо нужных строк находит еще и "не нужные".

Убрал предыдущие фильтры в запросе, так же само все...


Я подккоректировал Ваш запрос следующем образом, он тоже не работает :(

and (`order_like`.`id_post`, `order_like`.`id_user`) not in
                                        (select `order_like_person`.`id_post`, `order_like_person`.`id_first` from `order_like_person` where `id_user` = '$id')

Вероятно что-то неладно в Вашем королевстве ;) Запрос работает так, как должен.

select * from order_like 
where (id_post, id_user) not in (select id_post, id_first from order_like_person)

вернёт все записи из order_like которых нет в order_like_person по условию
"id_post != id_post and id_user != id_first" для каждой строки.

Эквивалентный запрос:
select * from order_like 
where not exists(select true from order_like_person where id_post = order_like.id_post and id_first = order_like.id_user)


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
lop_atin
Цитата (S.Chushkin @ 14.09.2013 - 09:42)
Цитата (lop_atin @ 13.09.2013 - 23:59)
Ваш запрос срабатывает, но он помимо нужных строк находит еще и "не нужные".

Убрал предыдущие фильтры в запросе, так же само все...


Я подккоректировал Ваш запрос следующем образом, он тоже не работает :(

<pre class="sh_sourceCode" rel="php"><span class="sh_function">and</span> <span class="sh_symbol">(</span>`order_like`<span class="sh_symbol">.</span>`id_post`<span class="sh_symbol">,</span> `order_like`<span class="sh_symbol">.</span>`id_user`<span class="sh_symbol">)</span> not in
                                        <span class="sh_symbol">(</span>select `order_like_person`<span class="sh_symbol">.</span>`id_post`<span class="sh_symbol">,</span> `order_like_person`<span class="sh_symbol">.</span>`id_first` from `order_like_person` where `id_user` <span class="sh_symbol">=</span> <span class="sh_string">'$id'</span><span class="sh_symbol">)</span></pre>

Вероятно что-то неладно в Вашем королевстве ;) Запрос работает так, как должен.

select * from order_like 
where (id_post, id_user) not in (select id_post, id_first from order_like_person)

вернёт все записи из order_like которых нет в order_like_person по условию
"id_post != id_post and id_user != id_first" для каждой строки.

Эквивалентный запрос:
select * from order_like 
where not exists(select true from order_like_person where id_post = order_like.id_post and id_first = order_like.id_user)

Да, ошибка была у меня. Ваш код прекрасно работает! Отблагодарил wink.gif

Спасибо всем за помощь!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.