2017-02-07 11 views
0

Я сделал запрос sql для конкретной необходимости, но я не профессионал SQL, поэтому мне нужна помощь, чтобы «улучшить» запрос.оптимизация sql-запроса обновление зависит от другой таблицы

Во-первых, у меня есть 3 таблицы:

  • пользователя (идентификатор, имя пользователя, ...)
  • действие (идентификатор, точка, limitPerDay)
  • история (идентификатор, user_id, action_id, created_at , is_used_for_score)

Каждый раз, когда пользователь может делать определенное действие, это журнал в таблице истории (is_used_for_score будет истинным или ложным, если предел достигнут или нет)

Но мне нужно запросить обновление всех is_used_for_score, потому что при определенных условиях is_used_for_score можно перейти от ложного к истине

Мой запрос на самом деле

SET @num := 0, @user_id := 0, @type := '', @date := ''; 

UPDATE history SET is_used_for_score = 1 WHERE history.id IN (
    SELECT history_id FROM (
     SELECT 
      history.id AS history_id, 
      action.limitPerDay AS limit_per_day, 
      action.point, 
      @num := IF(
       @type = action_id, 
       IF(
        @date = CONCAT(YEAR(history.created_at), '-', MONTH(history.created_at), '-', DAY(history.created_at)), 
        IF (
         @user_id = user_id, 
         @num + 1, 
         1 
        ), 
        1 
       ), 
       1 
      ) AS row_number, 
      @user_id := user_id AS user_id, 
      @type := action_id AS action_id, 
      @date := CONCAT(YEAR(history.created_at), '-', MONTH(history.created_at), '-', DAY(history.created_at)) AS `date` 
     FROM history 
     LEFT JOIN `action` ON action.id = action_id 
     HAVING (row_number <= limit_per_day) OR (limit_per_day IS NULL) 
     ORDER BY history.created_at ASC, user_id, action_id 
    ) AS history_id_count_for_vote 
); 

Но, я уверен, что, вероятно, не самый лучший способ для этого. У вас есть какое-то предложение, которое может улучшить запрос?

Спасибо

+0

Невозможно пробиться через это. В любом случае, удачи. – Strawberry

+0

Опишите, на английском, как нужно вычислять 'is_used_for_score'. –

ответ

1

по вопросам, как это, я повторяю неустанно, снова и снова: SQL это язык, не забывайте этого (сползания в императивности, так же, как вы делаете)!

Это означает, что вы собираетесь определить, ЗАКАЗИТЕ набор (ы), с которым вы собираетесь работать, - другими словами, сообщите обозревателю, ЧТО вы хотите, оставив ХАУ по своему усмотрению.

Это краеугольный камень.

Так что попробуйте продумать это следующим образом: «Мне нужно обновить НЕКОТОРЫЙ набор записей [те, которые упали под« ... определенные условия is_used_for_score могут проходить от false до true »), поэтому давайте определим,

И это то, чего вам не хватает здесь - так что, пожалуйста, дайте нам знать, определите эти условия и обновите свой вопрос, потому что это довольно людоед, пытаясь извлечь его из этого беспорядка, который вы опубликовали.

+0

Неустанно, снова и снова? Вы ответили на 14 вопросов. Но соглашайтесь на последний момент! – Strawberry

+0

stackoverflow - это не единственное место на этой планете :-) –

+0

О, но это так! :-) – Strawberry

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

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