Как сначала показывать элементы с block = 1, только если p.user является создателем страницы?

0

У меня есть страница, и на этой странице есть владелец.

Я бы хотел выбрать участников этой страницы.

Проблема в том, что если он является владельцем страницы, который вошел в систему (как создал страницу), я хотел бы показать сначала (и только для него) членов с блоком = 1 для объединения авторизации.

Так что я:

CREATE TABLE 'page' (
  'id' int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  'user' INT(11) UNSIGNED NOT NULL, // who created the page.
  'title' varchar(40),
  'privado' tinyint(1) NOT NULL DEFAULT '0',
)

и page_members (которые присоединяются к странице):

CREATE TABLE IF NOT EXISTS 'page_members' (
  'id' int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  'user' INT(11) UNSIGNED NOT NULL, // who is joining
  'member' INT(11) UNSIGNED NOT NULL, // page id
  'block' tinyint(1) NOT NULL DEFAULT '0', // block 1 = need autorization
  FOREIGN KEY ('member') REFERENCES page ('id')
)

Предположим, у меня есть страница, созданная пользователем 1, и у нее есть члены. Я хотел бы сначала выбрать членов с блоком = 1, если кто-то вошел в систему, является владельцем страницы (таблица страниц, пользователь). если это не владелец страницы, я бы хотел выбрать только элементы с блоком = 0.

Поэтому я попробовал:

select p.user, p.title, pm.user, pm.block from page_members pm
left join page p on pm.member = p.id
where pm.member = 100 // show members from page 100

,

    and p.user = 1 // from here I'm not sure what to do, 
I'd like to select and show first the members with block = 1 
but only if p.user = 1 (the page owner).

Например, если p.user = 2, он не является владельцем страницы, поэтому не показывайте участников с блоком 1, только блок 0.

есть идеи?

  • 0
    Что означает «Первый участник». Как вы сортируете это для «Первый»?
  • 0
    @JNevill первые участники. извиняюсь. Я отредактирую
Показать ещё 3 комментария
Теги:
join
left-join

2 ответа

1

Вы можете отфильтровать результаты после объединения:

select p.user, p.title, pm.user, pm.block from page_members pm
left join page p on pm.member = p.id
where pm.member = 100 
and ((p.user = 1) or ((p.user !=1) and (pm.block = 0)))
order by p.user, pm.block desc

и с заказом у вас есть тот вид, который вы хотите

  • 1
    Тесты столбцов p должны быть в предложении ON , потому что это LEFT JOIN .
1

Вы можете использовать IF() вокруг условия, чтобы сделать его зависимым от какого-либо другого условия.

select p.user, p.title, pm.user, pm.block 
from page_members pm
left join page p on pm.member = p.id AND IF(p.user = @logged_in_user, true, pm.block = 0)
where pm.member = 100
  • 0
    спасибо за Ваш ответ. Могу ли я также использовать order by pm.block desc чтобы order by pm.block desc показывать пользователям с block = 1? Это нормально?
  • 1
    Конечно, это сработает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню