2014-02-10 5 views
0

Я использую XenForo, который имеет таблицы:PHP и MySQL проверка MySQL LEFT JOIN с указанным условием

  • пользователя: user_id, user_group_id
  • резьбы: thread_id, user_id, липкий

Мне нужен запрос для изменения user_group_id с 15 до 14, если у них нет ни одной нити (sticky = 0 в потоке).

Возможно ли это с левым объединением, и если да, то как?

Спасибо.

+0

Вы имеете в виду запрос на обновление, чтобы изменить таблицу пользователя? или просто запрос выбора, который динамически изменяет одно из значений поля? –

+0

одно значение поля, Marc B – hatxi

ответ

0
update user u 
set u.user_group_id=14 
where u.user_group_id=15 and 
    (select sticky from thread where thread_id = u.user_id)=0; 
0

ли вы имеете в виду:

UPDATE user SET user_group_id=14 WHERE user_group_id=15 AND 
0 = (SELECT COUNT(*) FROM thread WHERE sticky=0 AND user_id=user.user_id) 

это не использовать LEFT JOIN. Обязательно ли использовать LEFT JOIN?

+0

Ошибка возврата Mysql: Подзапрос возвращает более 1 строки – hatxi

+0

oops. У меня есть опечатка. изменить '=' на 'IN' – Raptor

+0

thread.user_id = user.user_id, может быть, неправильно? – hatxi

0

Это будет делать это

update user set user_group_id = 14 
where user_group_id = 15 
and user_id in (select user_id from threads where sticky=0) 

EDIT:

В этом случае, вместо того чтобы использовать подзапрос, вы можете присоединиться как таблицы, в то время как обновление, как показано ниже

update user u 
inner join thread t on 
    u.user_id = t.user_id and t.sticky = 0 
set u.user_group_id = 14 
where u.user_group_id = 15 

См. Демо-версию здесь http://sqlfiddle.com/#!2/58b121/1.

+0

У меня есть 403,014 строки, соответствующие этому условию (выберите user_id из тем, где sticky = 0). Пожалуйста, помогите мне в оптимизации для mysql? – hatxi

+0

@hatxi, см. Мой отредактированный ответ. – Rahul

 Смежные вопросы

  • Нет связанных вопросов^_^