powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Конвертнуть запрос из SQLite в MySQL
16 сообщений из 16, страница 1 из 1
Конвертнуть запрос из SQLite в MySQL
    #39694336
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот работающий запрос в SQLite
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * FROM 
(SELECT DISTINCT task1_id FROM raspr 
UNION 
SELECT DISTINCT task2_id FROM raspr 
UNION 
SELECT DISTINCT task3_id FROM raspr 
UNION 
SELECT DISTINCT task4_id FROM raspr) 
WHERE task1_id > 0


При переносе на MySQL возникает ошибка "Every derived table must have its own alias".
Куда эти альясы приписать? Или вообще в MySQL этот запрос можно проще записать?
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694421
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу так, чтобы каждый подзапрос имел свой альяс (убрав лишнее WHERE):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t.* FROM (
  (SELECT DISTINCT task1_id FROM raspr) t1 
  UNION 
  (SELECT DISTINCT task2_id FROM raspr) t2 
  UNION 
  (SELECT DISTINCT task3_id FROM raspr) t3 
  UNION 
  (SELECT DISTINCT task4_id FROM raspr) t4 
) t


Но ругается на 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't2
Что еще не так?
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694441
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingЧто еще не так?подзапросам в UNION не нужны алиасы. И потом - если у тебя и так UNION DISTINCT, то нахрена ещё DISTINCT в подзапросах?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT t.* 
FROM (
  SELECT task1_id FROM raspr
  UNION 
  SELECT task2_id FROM raspr 
  UNION 
  SELECT task3_id FROM raspr 
  UNION 
  SELECT task4_id FROM raspr 
) t
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694444
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
о DISTINCT еще не думал :)
А ваш вариант я попробовал сразу же, но 1137 - Can't reopen table: 'raspr'
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694448
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raspr - это временная таблица, что ли? статические таблицы или представления не могут дать такое сообщение.
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694453
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если raspr - временная таблица, то решение будет таким:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT DISTINCT CASE nums.num
                WHEN 1 THEN task1_id 
                WHEN 2 THEN task2_id 
                WHEN 3 THEN task3_id 
                WHEN 4 THEN task4_id 
                END task_id
FROM raspr, (SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) nums
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694459
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Да, создаю
Код: sql
1.
2.
3.
4.
CREATE TEMPORARY TABLE raspr (INDEX i1 (task1_id),INDEX i2 (task2_id),INDEX i3 (task3_id),INDEX i4 (task4_id)) ENGINE=MEMORY AS (
  SELECT v.id,task1hrs,task2hrs,task3hrs,task4hrs,task1_id,task2_id,task3_id,task4_id 
  FROM data d,vehicles v 
  WHERE (date_put BETWEEN '2018-08-01 00:00:00' AND '2018-08-10 23:59:59') AND d.vehicle_id = v.id);


А затем тот самый запрос. Так нельзя?
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694467
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaЕсли raspr - временная таблица, то решение будет таким:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT DISTINCT CASE nums.num
                WHEN 1 THEN task1_id 
                WHEN 2 THEN task2_id 
                WHEN 3 THEN task3_id 
                WHEN 4 THEN task4_id 
                END task_id
FROM raspr, (SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) nums


Уровень "Бог" :) Да, это работает!
А как можно исключить из выборки NULL? И почему, все же, нельзя мой запрос применить к временной таблице?
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694648
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingкак можно исключить из выборки NULL?По-моему, очевидно, WHERE expression IS NOT NULL .

LiYingпочему, все же, нельзя мой запрос применить к временной таблице?Потому что просто нельзя. Implementation такой. И это - невозможность использования копий временной таблицы в одном запросе, - явно описано в документации.
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694657
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Да, уже сам разобрался. Спасибо за помощь!
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694698
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Однако, я поспешил... Если добавить WHERE task_id IS NOT NULL, то ошибка > 1054 - Unknown column 'task_id' in 'where clause'. Но в то же время ORDER BY task_id прекрасно сортирует выборку. Почему WHERE "не знает" про поле 'task_id'?
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694703
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingЕсли добавить WHERE task_id IS NOT NULL, то ошибка > 1054 - Unknown column 'task_id' in 'where clause'.task_id - это имя поля выходного набора? тогда не WHERE, а HAVING.
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39694706
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с HAVING все получилось. Еще раз спасибо!
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39695357
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Хотелось бы услышать ваше мнение. Вот итоговый запрос по вашим рекомендациям:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT DISTINCT CASE nums.num 
  WHEN 1 THEN task1_id 
  WHEN 2 THEN task2_id 
  WHEN 3 THEN task3_id 
  WHEN 4 THEN task4_id 
END task_id
FROM raspr, (SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) nums
HAVING task_id IS NOT NULL


У него такой план:


Но я придумал другой запрос, поэкспериментировал с ним - выдает те же результаты, что и выше:
Код: sql
1.
2.
3.
SELECT DISTINCT COALESCE(task1_id,task2_id,task3_id,task4_id) task_id 
FROM raspr 
HAVING task_id IS NOT NULL




Строка HAVING task_id IS NOT NULL в нем нужна, т.к. есть записи с task1_id,task2_id,task3_id,task4_id = NULL.
Выглядит попроще :)

Что скажете? Можно его использовать или есть какие нюансы, которые всплывут в каких-либо случаях?
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39695364
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingЧто скажете?Скажу, что запросы в принципе не эквивалентны. Достаточно появиться одной записи, в которой хотя бы два поля из четырёх NOT NULL - и пламенный привет... а построить constraint, который обеспечит не более одного NOT NULL значения на запись, в MySQL невозможно.
...
Рейтинг: 0 / 0
Конвертнуть запрос из SQLite в MySQL
    #39695365
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя, я видимо ошибся, мой запрос с COALESCE не совсем то выдает, просто чуть изменил исходный набор данных в таблице raspr... Голова дурная!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Конвертнуть запрос из SQLite в MySQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]