Как составить sql-запрос?

Говорим обо всем, что не имеет отношения к основной тематике сайта и форума. Установлена авточистка (400 дней).
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 8884
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 158 раз
Поблагодарили: 2506 раз
Контактная информация:

Как составить sql-запрос?

Сообщение Татьяна5 » 31.10.2018 5:35

(Возможно, просто, но запуталась)
В некоторой таблице, нестандартной, есть набор attach_id. Надо получить все пары post_id - attach_id (для всех вложений в тех сообщениях, не только для известных) одним запросом, желательно лёгким. Как?

Аватара пользователя
nissin
phpBB 3.0.2
Сообщения: 2098
Зарегистрирован: 16.12.2007 14:01
Откуда: Павлодар
Благодарил (а): 7 раз
Поблагодарили: 325 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение nissin » 31.10.2018 6:13

Код: Выделить всё

SELECT DISTINCT post_id, attach_id FROM table
Всё повторяется. nurlan.info

Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 8884
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 158 раз
Поблагодарили: 2506 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение Татьяна5 » 31.10.2018 6:47

nissin, не, выбирать всё слишком много будет
Есть набор id вложений (в отдельной таблице). Этим вложениям соответствуют некоторые id сообщений в _posts. Надо получить весь список вложений только в тех сообщениях (в сообщениях по несколько вложений)

Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 3998
Зарегистрирован: 11.01.2005 14:29
Откуда: Питер
Благодарил (а): 97 раз
Поблагодарили: 385 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение Siava » 31.10.2018 8:45

Татьяна5, тогда select из двух таблиц вместе (таблица вложений и постов) с условием, которое сравнивает наличие одинаковых post_id в обеих таблицах.
Для очистки вложений в теме что ли?)
Еще одно нарушение правил и будете забанены. © Mr. Anderson
https://siava.ru/forum/ (phpbb 2.0.x, 3.1.x 3.2.x)

Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 8884
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 158 раз
Поблагодарили: 2506 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение Татьяна5 » 31.10.2018 15:54

Для выбора списка в расширении
Такой

Код: Выделить всё

'SELECT p.post_id, a.attach_id 
					FROM ' . $this->ymsm_objects_table . ' y

					JOIN ' . $this->table_prefix  . 'attachments a
					ON y.post_id  = a.attach_id AND y.ymsm_o_type = '
							. $this->ymsm_ot_aimg_const . ' AND a.is_orphan = 0 AND a.in_message = 0
					
					JOIN ' . $this->posts_table  . ' p 
					ON a.post_msg_id  = p.post_id ' 
					
					. ' JOIN ' . $this->topics_table  . ' t 
					ON p.topic_id  = t.topic_id 
					
					WHERE ' . $this->phpbb_content_visibility->get_visibility_sql('t.topic', 0, '') . ' AND ' . $this->phpbb_content_visibility->get_visibility_sql('p.post', 0, '') . ' AND y.ymsm_o_pin = 1';
возвращает ровно по одному вложению из сообщения
Siava писал(а):
31.10.2018 8:45
select из двух таблиц вместе
Пробовала. Что-то упускаю со всеми 3-мя таблицами (_topics не в счёт), всё равно по одному возвращает

Отправлено спустя 4 минуты 58 секунд:
В y.post_id записаны id вложений (для типа $this->ymsm_ot_aimg_const)

Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 3998
Зарегистрирован: 11.01.2005 14:29
Откуда: Питер
Благодарил (а): 97 раз
Поблагодарили: 385 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение Siava » 31.10.2018 16:02

Татьяна5 писал(а):
31.10.2018 15:59
В y.post_id записаны id вложени
Да.. я после понял, что это не относится к самим постам, поэтому удалил ответ)

Быть может ещё какой-нибудь group by сюда нужен?
Еще одно нарушение правил и будете забанены. © Mr. Anderson
https://siava.ru/forum/ (phpbb 2.0.x, 3.1.x 3.2.x)

Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 8884
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 158 раз
Поблагодарили: 2506 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение Татьяна5 » 31.10.2018 16:03

Что группировать, если оно не выбирается?

Аватара пользователя
nissin
phpBB 3.0.2
Сообщения: 2098
Зарегистрирован: 16.12.2007 14:01
Откуда: Павлодар
Благодарил (а): 7 раз
Поблагодарили: 325 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение nissin » 01.11.2018 5:54

Для начала попробовать запрос немного попроще:

Код: Выделить всё

'SELECT a.post_msg_id, a.attach_id 
					FROM ' . $this->table_prefix  . 'attachments a
 
					RIGHT JOIN ' . $this->ymsm_objects_table . ' y
					ON (y.post_id  = a.attach_id)
					WHERE y.ymsm_o_type = '	. $this->ymsm_ot_aimg_const . ' AND a.is_orphan = 0 AND a.in_message = 0
Всё повторяется. nurlan.info

Аватара пользователя
Dbonz
phpBB 2.0.0
Сообщения: 225
Зарегистрирован: 08.07.2012 14:04
Благодарил (а): 25 раз
Поблагодарили: 25 раз

Re: Как составить sql-запрос?

Сообщение Dbonz » 08.02.2019 21:57

Господа вы давно в теме варитесь.

Кто-нибудь знает красивый и безопасный метод применить автоинкремент к строкам с первичным ключом (id поле), будто они стали вновь добавленными как при INSERT INTO?
  • Вариант с подзапросом select max(id) +1 не надёжен при параллельных запросах
  • Блокировать таблицу на время транзакции не очень хорошо
  • Копировать строки в той же таблице надёжно, но ресурсоёмко
Какие ещё могут быть варианты?

Аватара пользователя
LavIgor
Поддержка
Поддержка
Сообщения: 3482
Зарегистрирован: 28.04.2014 8:16
Благодарил (а): 36 раз
Поблагодарили: 905 раз

Re: Как составить sql-запрос?

Сообщение LavIgor » 08.02.2019 23:55

Dbonz, а что именно требуется-то?
Автоинкремент на то и "авто", что заботиться о нём особо не нужно.
Задача, видимо, всё же другая, но здесь она не поставлена.

Аватара пользователя
Sheer
phpBB Guru
phpBB Guru
Сообщения: 10752
Зарегистрирован: 18.02.2007 19:01
Откуда: Рига, Латвия (страна-недоразумение)
Благодарил (а): 42 раза
Поблагодарили: 2338 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение Sheer » 09.02.2019 0:01

Dbonz, Нифига не понял. Нужно чтобы ID шли по порядочку без "дырок"?

Код: Выделить всё

ALTER TABLE table_name AUTO_INCREMENT = 1;
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.

Аватара пользователя
Dbonz
phpBB 2.0.0
Сообщения: 225
Зарегистрирован: 08.07.2012 14:04
Благодарил (а): 25 раз
Поблагодарили: 25 раз

Re: Как составить sql-запрос?

Сообщение Dbonz » 09.02.2019 0:17

Нет, без ALTER TABLE. Поле с автоинкрементом уже есть.

Задача тривиальна до безобразия

Есть (смотрим на id 2)

Код: Выделить всё

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

Нужно

Код: Выделить всё

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
|  7 | cat     |
+----+---------+

Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 8884
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 158 раз
Поблагодарили: 2506 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение Татьяна5 » 09.02.2019 1:49

Или я чего-то не понимаю, или всё просто

Код: Выделить всё

UPDATE table SET id = id+1 WHERE id >1

Аватара пользователя
Sheer
phpBB Guru
phpBB Guru
Сообщения: 10752
Зарегистрирован: 18.02.2007 19:01
Откуда: Рига, Латвия (страна-недоразумение)
Благодарил (а): 42 раза
Поблагодарили: 2338 раз
Контактная информация:

Re: Как составить sql-запрос?

Сообщение Sheer » 09.02.2019 2:03

Я кажись понял, что он хочет. Нужно переместить какую-то запись в конец таблицы, то есть сделать его id больше максимального на единицу.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.

Аватара пользователя
Dbonz
phpBB 2.0.0
Сообщения: 225
Зарегистрирован: 08.07.2012 14:04
Благодарил (а): 25 раз
Поблагодарили: 25 раз

Re: Как составить sql-запрос?

Сообщение Dbonz » 09.02.2019 2:05

Sheer, именно. И не одну запись, а сразу несколько.

Самое глупое что можно сделать

Код: Выделить всё

INSERT INTO t1 SELECT null, name FROM t1 WHERE id IN(2,3,4) ORDER BY id ASC

потом удалить старые строки. Это накладно.


Если set id=(select max(id)+1 ....), то надо блокировать таблицу на время запроса, что тоже не очень хорошо.

Ответить

Вернуться в «Флейм»