mysql - копирование всей строки из одной таблицы в другую и добавление количества (*) с условиями в одном запросе - PullRequest
0 голосов
/ 22 марта 2012

Я застрял с моей проблемой.После просмотра в Интернете и ТАК я не нашел решение.Вы моя последняя надежда :) Вот проблема:

У меня есть три таблицы:

table_tmp

id | name | val | owner |
------------------------
5  | abc  | 100 | 3
6  | cde  | 200 | 4

table_ready

id | special_number | id_tmp | name_tmp | val_tmp | owner_tmp | 
---------------------------------------------------------------
1  |  0             | 1      | xyz      | 100     | 3         |
2  |  0             | 2      | zzz      | 100     | 4         |
3  |  1             | 3      | kkk      | 200     | 3         |
4  |  2             | 4      | uuu      | 130     | 3         |

Теперь яхочу скопировать всю строку с owner = 3 из table_tmp в table_ready.Это легко - я делаю это с помощью:

INSERT INTO table_ready SELECT '', '', t.* FROM table_tmp t WHERE owner = 3;

Но я хочу, чтобы этот запрос подсчитывал также все строки из table_ready, которые имеют owner_tmp = 3 и val_tmp = 100. Поэтому после запроса table_ready будет выглядеть так:

id | special_number | id_tmp | name_tmp | val_tmp | owner_tmp | 
---------------------------------------------------------------
1  |  0             | 1      | xyz      | 100     | 3         |
2  |  0             | 2      | zzz      | 100     | 4         |
3  |  1             | 3      | kkk      | 100     | 3         |
4  |  2             | 4      | uuu      | 130     | 3         |
5  |  3             | 5      | abc      | 100     | 3         |

Что случилось?значения из table_tmp (name, val и owner) отправляются в table_ready (name_tmp, val_tmp, owner_tmp), идентификатор автоматически увеличивается, а специальный номер является результатом запроса:

SELECT count(id) FROM table_ready WHERE owner_tmp = 3 AND val_tmp = 100.

Как объединить эти запросы в один?

К счастью после написания этого поста, я пошел побрить бороду, приготовить чай и нашел решение.Мне не нужно присоединяться к этим запросам вообще.Если у кого-то есть решение вопроса выше, не стесняйтесь написать его - я был бы рад улучшить свои навыки.Извините за беспокойство:)

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

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

SELECT count(id) FROM table_ready WHERE owner_tmp = 3 AND val_tmp = 100

возвращает 3, и на самом деле возвращает 1 с учетом ваших данных.

В любом случае, это запрос Iдумаю, что вы ищете:

INSERT INTO table_ready
  SELECT '',
    (SELECT count(*) FROM table_ready
     WHERE owner_tmp = 3 AND val_tmp = 100),
  t.* FROM table_tmp t
WHERE owner = 3;
0 голосов
/ 22 марта 2012

Я в самолете, поэтому я не могу проверить это прямо сейчас, но попробуйте следующее:

INSERT INTO table_ready SELECT '', IFNULL(r.count(distinct id),0) as special_number, t.*, 
FROM table_tmp t LEFT OUTER JOIN table_ready r ON t.owner = r.owner_temp 
WHERE t.owner = 3 and r.val_tmp = 100 GROUP BY r.owner_temp;

В противном случае, я думаю, вам придется использовать подзапрос.

Редактировать: добавлен IFNULL, не уверен, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...