Перейти к содержимому

Фотография
- - - - -

Помогите составить sql запрос


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
Сообщений в теме: 4

#1 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 18 Апрель 2013 в 19:41

Две таблицы, одна основная - магазин(id,name,opisanie и т.д). Другая содержит id купленных вещей юзерами из первой основной таблицы.
Нужно вывести на страницу все товары, кроме тех, которые купил пользователь.
Попробовал использовать "left join" [см ниже]
Этот вариант выводит всё подряд:
select `shop`.`name`, `us`.`id_tovar`
from `shop`
left join `user_shop` as `us`
on `shop`.`id` = `us`.`id_tovar` and `us`.`id_login` = 1
На выходе получаю поле "id_tovar" - какое-то число, значит куплено. Или NULL если пользователь не покупал этот товар. Решил добавить where, но он вообще ничего не выводит:
select `shop`.`name`, `us`.`id_tovar`
from `shop`
left join `user_shop` as `us`
on `shop`.`id` = `us`.`id_tovar` and `us`.`id_login` = 1
where
`us`.`id_tovar` = NULL

Вопрос можно решить конечно как-то так:
Взять все id, которые купил пользователь [запрос 1]
Вывести на страницу все товары из основной таблицы, но добавить условие "not in()", в котором будут содержаться id из первого запроса.
Но это лишний запрос, лишний код и вообще мне этот вариант не нравится.

Сообщение отредактировал FiRеFоX: 18 Апрель 2013 в 19:47

  • 0

Спонсор

#2 mrlasking

mrlasking

    $_GET['rich'] or die('trying');

  • Участник
  • 161
    323 сообщ.

Отправлено 19 Апрель 2013 в 00:52

*in progress*

Сообщение отредактировал mrlasking: 19 Апрель 2013 в 00:56

  • 0

#3 brevis

brevis

    Увлеченный

  • Участник
  • 383
    452 сообщ.

Отправлено 19 Апрель 2013 в 08:19

Но это лишний запрос, лишний код и вообще мне этот вариант не нравится.


Ну прям какие-то гламурные программисты. "Меня раздражает эта кофточка, сумочка... и вообще я ноготь сломала...".

Кажется мне подвел тебя символ равно здесь:
where `us`.`id_tovar` = NULL

Нужно:
where `us`.`id_tovar` IS NULL

http://sqlfiddle.com/#!2/787f3/1
  • 2

#4 mrlasking

mrlasking

    $_GET['rich'] or die('trying');

  • Участник
  • 161
    323 сообщ.

Отправлено 19 Апрель 2013 в 13:06

brevis, плюсую) сам вчера посидел над этим запросом, но стер ответ ибо искал может покрасивше найду. Кстати, первое впечатление от вопроса у меня было именно такое же:

Ну прям какие-то гламурные программисты. "Меня раздражает эта кофточка, сумочка... и вообще я ноготь сломала...".

НО! Потом я вспомнил, что FiRеFоX наш игру делает, а в играх количество магазинов - не один и покупок количество сравнимо с реально большими интернет магазинами. Так что джоины очень оправданное решение, хотя и не по причине "мне не нравится", а работать быстрее будет, но тут еще индексация таблиц важна.
  • 0

#5 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 19 Апрель 2013 в 15:33

спасибо за помощь, а также за любезную критику :biggrin: Пойду фиксить)
  • 0



Похожие темы Свернуть

Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей