Нужен совет по MySQL

CN
На сайте с 29.09.2007
Offline
155
473

Есть 2 таблицы "пользователи", "товар".

Структура:

Пользователи - id|name

Товар - id|user_id|type|name

"type" - 1 или 0

Цель:

Нужно вывести всех пользователй у которых есть записи только одного типа, 1 или 0.

I
На сайте с 05.06.2006
Offline
117
#1

select * from пользователи where id = ALL( select user_id from Товар where type=1)

Миграция с ISPManager 4 в VestaCP (https://chast.in/copy-users-from-ispmanager-2-vestacp.html) Хостинг серверов, пользуюсь сам (http://vps-server.ru/rp/pl.php?96)
CN
На сайте с 29.09.2007
Offline
155
#2
ivtrans:
select * from пользователи where id = ALL( select user_id from Товар where type=1)

Наверное уточню.

Вывести пользователей у которых есть товар ТОЛЬКО одного типа

т.е. есть с типом 1 но нет с типом 0

K
На сайте с 29.04.2008
Offline
74
#3


select uu.*,tt.`type` from `user` as uu
left join `tovar` as tt on tt.`iduser` = uu.`id`
where uu.`id` in
(
SELECT (case when count(u.`type`) = 2 then null else u.`iduser` end) as coun
FROM
tovar as u
GROUP BY u.`iduser`
HAVING coun is not null
)
AND tt.`type` = 1

Попробуйте так...

Open Source Danneo CMS (http://nafn.ru)
B
На сайте с 03.07.2008
Offline
48
#4

SELECT u.* FROM users INNER JOIN items as i on u.id=i.user_id WHERE i.type=0

Может где в синтаксисе ошибся, нет базы проверить под рукой

Я не создаю сайты - я делаю их лучше (QA)
V
На сайте с 01.06.2007
Offline
79
#5

select u.id, count(t1.id) as t1_count, count(t0.id) as t0_count

from users u

left join tovar t1 on t1.user_id = u.id and t1.type = 1

left join tovar t0 on t0.user_id = u.id and t0.type = 0

group by u.id

having (t1_count > 0 and t0_count == 0) or (t0_count > 0 and t1_count == 0)

вот так. НО если у вас будет монго юзеров и товаров то на это запросе mysql будет загинатся.

ИМХО если у вас тупо 2-а тайпа - добавте два флага в таблицу юзеров type_1 and type_2 и устанавливайте их при редактировании. Тогда запрос упростится в разы

CN
На сайте с 29.09.2007
Offline
155
#6
vagrand:
select u.id, count(t1.id) as t1_count, count(t0.id) as t0_count
from users u
left join tovar t1 on t1.user_id = u.id and t1.type = 1
left join tovar t0 on t0.user_id = u.id and t0.type = 0
group by u.id
having (t1_count > 0 and t0_count == 0) or (t0_count > 0 and t1_count == 0)

вот так. НО если у вас будет монго юзеров и товаров то на это запросе mysql будет загинатся.
ИМХО если у вас тупо 2-а тайпа - добавте два флага в таблицу юзеров type_1 and type_2 и устанавливайте их при редактировании. Тогда запрос упростится в разы

Спасибо.

Этот вариант больше похож на правду. Запрос не часто будет использоваться и только одним пользователем.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий