2014-07-20 2 views
0

У меня есть следующий ЗЕЬЕСТ, возвращающий данные, пример ниже:MySQL объединить UPDATE и SELECT, запрос

SELECT performers.ID, 
     performers.Name, 
     COUNT(*) AS CountOfDeals, 
     COUNT(DISTINCT(deals.Name)) AS CountOfAliases 
    FROM deals RIGHT JOIN performers 
       ON deals.name LIKE CONCAT('%', performers.name, '%') 
WHERE performers.ID IN (27952, 27951, 27950, 27949, 27948) 
GROUP BY Name; 

Пример данных, возвращаемый:

ID  Name    CountOfDeals  CountOfAliases 
27952 Christine Hoberg   1     0 
27951 Indian Jewelry   1     0 
27952 Kinky Friedman   5     3 
27949 KJ-52      1     0 
27960 River Whyless    1     0 

Я хочу совместить это с утверждением UPDATE

UPDATE performers 
    SET RawAliasCount = CountOfAliases, 
     RawDealCount = CountOfDeals 
WHERE ID = ? 

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

Спасибо.

+1

Я считаю, что ваш запрос не возвращает нужный результат для CountOfDeals. Попробуйте проверить его с пустой таблицей для сделок, она возвращает 1 в любом случае. попробуйте добавить туда, где предложение deal.name не равно null. – Tata

+1

И в основном это убийца производительности, чтобы использовать JOIN-исполнителей на deal.name LIKE CONCAT ('%', performers.name, '%'). Это соединение будет выполнять полное сканирование таблицы, даже если у вас есть индекс в поле deal.name. – Tata

+0

Tata, возможно, вы были правы, там должно быть несколько нулевых результатов. Я недавно изменил его, поэтому придется провести еще несколько тестов. – pixelkicks

ответ

4

Использование update с join:

UPDATE performers p JOIN 
     (SELECT performers.ID, performers.Name, COUNT(*) AS CountOfDeals, 
       COUNT(DISTINCT(deals.Name)) AS CountOfAliases 
     FROM deals RIGHT JOIN 
      performers 
      on deals.name LIKE CONCAT('%', performers.name, '%') 
     WHERE performers.ID IN (27952, 27951, 27950, 27949, 27948) 
     GROUP BY Name 
     ) pp 
     ON pp.id = p.id 
    SET RawAliasCount = pp.CountOfAliases, 
     RawDealCount = pp.CountOfDeals; 
0
UPDATE performers 
SET performers.RawAliasCount = count_table.CountOfAliases, performers.RawDealCount = count_table.CountOfDeals 
FROM performers 
     INNER JOIN 
     (
      SELECT 
      performers.ID, performers.Name, COUNT(*) AS CountOfDeals, 
      COUNT(DISTINCT(deals.Name)) AS CountOfAliases 
      FROM deals RIGHT JOIN performers on deals.name LIKE CONCAT('%', performers.name, '%') 
      WHERE performers.ID IN (27952, 27951, 27950, 27949, 27948) 
      GROUP BY Name 
     ) count_table 
ON count_table.ID = performers.ID; 

Когда этот тип вопроса спрашивается, спасибо поставить схему таблицы.

Редактировать: извините, это синтаксис sql-server.

+1

Это синтаксис SQL Server, а не синтаксис MySQL. –

+0

Вы можете исправить это, просто переместив SET после объединения и избавившись от FROM. – siride

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