[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка
Shuriken
Доброго времени суток!

Есть следующие таблицы: user (id, name), в которой содержаться имена юзеров, book (id, name), в которой содержаться названия книг, userbook (id, user_id, book_id), в которой содержаться книги прочитанные юзером.

Итак, на страницу выводятся названия книг с чекбоксами и юзер проставляет галочку напротив прочитанной книги. После отправки формы данные заносятся в таблицу userbook.

Не получается выбрать книги с соответствующими записями из userbook. Делал так:
select *
from book b
left join userbook ub on b.id = ub.book_id
where ub.user_id = <айдишник_юзера_из_сессии>

Выводятся только названия книг, которые есть userbook, т.е. работает как INNER JOIN.

Подскажите, плиз
Hello
where ub.user_id = <айдишник_юзера_из_сессии> OR ub.user_id IS NULL


_____________
VPS от 5$, первые 2 месяца - бесплатно.
Shuriken
Цитата (Hello @ 23.12.2014 - 08:26)
where ub.user_id = <айдишник_юзера_из_сессии> OR ub.user_id IS NULL

Не подходит, т.к. NULL может не оказаться из-за выбора книг другими пользователями
Valick
Цитата
Выводятся только названия книг, которые есть userbook, т.е. работает как INNER JOIN.

вообще-то работает как left join ;)
не понятно что вы хотите получить в конечном итоге

select b.*, ub.* <тут лучше перечислить конкретные имена полей из каждой таблицы>
from book b
left join userbook ub on b.id = ub.book_id
where ub.user_id = <айдишник_юзера_из_сессии>


?

_____________
Стимулятор ~yoomoney - 41001303250491
Shuriken
Цитата (Valick @ 23.12.2014 - 09:17)
Цитата
Выводятся только названия книг, которые есть userbook, т.е. работает как INNER JOIN.

вообще-то работает как left join ;)
не понятно что вы хотите получить в конечном итоге

select b.*, ub.* <тут лучше перечислить конкретные имена полей из каждой таблицы>
from book b
left join userbook ub on b.id = ub.book_id
where ub.user_id = <айдишник_юзера_из_сессии>


?

В конечном итоге должен быть список всех книг и соответствующую запись из userbook указанного юзера, если она есть, если записи нет, то NULL.
andrey888
для начала я бы поменял название первого поля в book или userbook , чтобы при джоине не было одинаковых полей в двух использующихся таблицах (это так, на всякий случай) .. ну а потом можно заменить LEFT JOIN на FULL JOIN и посмотреть что получится.

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
Alchemist
Shuriken, перенеси условие из WHERE в ON
Shuriken
Цитата (andrey888 @ 23.12.2014 - 10:44)
для начала я бы поменял название первого поля в book или userbook , чтобы при джоине не было одинаковых полей в двух использующихся таблицах (это так, на всякий случай) .. ну а потом можно заменить LEFT JOIN на FULL JOIN и посмотреть что получится.

В MySQL нет FULL JOIN
Shuriken
Цитата (Alchemist @ 23.12.2014 - 10:56)
Shuriken, перенеси условие из WHERE в ON

Ооо, это оно! Спасибо!
sergeiss
Цитата (andrey888 @ 23.12.2014 - 12:44)
для начала я бы поменял название первого поля в book или userbook , чтобы при джоине не было одинаковых полей в двух использующихся таблицах (это так, на всякий случай)

Возможно, это из разряда холиваров :) Но как раз лучше одинаковые по сути поля разных таблиц называть одинаково. Тогда и в запросах с ДЖОЙНами всё получается нагляднее и понятнее.

Например. Вот в запросе написано (чуть выше в этой теме)

...
from book b
left join userbook ub
on b.id = ub.book_id

Если в таблице book поле id изначально было бы названо book_id вместо простого id, то запрос выглядел бы так:


...
from book b
left join userbook ub
using( book_id )

Может быть это мои "тараканы", но второй вариант записи мне понятнее. Особенно в сложных запросах, где много ДЖОЙНов, при таком подходе намного проще ориентироваться. При условии, естественно, что для всех таблиц соблюдается такой подход.

Заодно замечу, что это работает и для Мускуля, и для Постгре.

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

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

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

user posted image
Быстрый ответ:

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