«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2017/04/14 10:05:41  №973376 1
Можно ли как нибудь представить перечисление в виде (x, y, z) как таблицу чтобы при-JOIN'ить её к другой таблице? IN не подходит
Ответы: >>973382
Аноним 2017/04/14 10:28:23  №973382 2
>>973376
То-есть изначально мне надо выбрать все данные по дням, но у меня есть дни в которые данных в нужной таблице нет, и мне нельзя эти дни пропускать, а надо вывести день и 0 результатов.
К примеру '2017-04-14', 0. In не подходит, так как он игнорит эти дни, идеальным вариантом взять список дней и приJOIN'ить их к таблице нужной по которой шла бы группировка, но я не могу написать в виде SELECT * FROM ('2017-04-14', '2017-04-13')
Ответы: >>973384
Аноним 2017/04/14 10:32:07  №973384 3
>>973382
Как вариант - создавать временную таблицу но думаю это будет довольно медленный вариант в 4 хода - создание временной таблицы, наполнение данными, выборка, удаление таблицы
Ответы: >>973387
Аноним 2017/04/14 10:38:43  №973387 4
>>973384
Что то наподобие вышло

SELECT d.date, if (o.count is null, 0, o.count) as count, if(o.salary is null, 0, o.salary) as salary FROM `#date` as d
LEFT JOIN (SELECT count(*) as count, sum(total) as salary, DATE(date_added) as `date` FROM `order`) as o on o.date = d.date

Но лучше бы без временной таблицы.
Ответы: >>973389 >>973548
Аноним 2017/04/14 10:41:30  №973389 5
>>973387
Извините что нафлудил - забыл группировку по DATE(date_added) во внутреннем запросе
Ответы: >>973548
Аноним 2017/04/14 15:49:47  №973548 6
>>973389
>>973387
Если кому понадобится, решил без временных таблиц:

SELECT
d.date,
IF(o.count IS NULL, 0, o.count) AS count,
IF(o.salary IS NULL, 0, o.salary) AS salary
FROM
(SELECT
`date`
FROM
(SELECT ('2017-04-01') AS date UNION SELECT ('2017-04-02') AS date UNION SELECT ('2017-04-03') AS date UNION SELECT ('2017-04-04') AS date UNION SELECT ('2017-04-05') AS date UNION SELECT ('2017-04-06') AS date UNION SELECT ('2017-04-07') AS date UNION SELECT ('2017-04-08') AS date UNION SELECT ('2017-04-09') AS date UNION SELECT ('2017-04-10') AS date UNION SELECT ('2017-04-11') AS date UNION SELECT ('2017-04-12') AS date UNION SELECT ('2017-04-13') AS date UNION SELECT ('2017-04-14') AS date) AS date_tables) AS d
LEFT JOIN
(SELECT
COUNT(*) AS count,
SUM(total) AS salary,
DATE(date_added) AS `date`
FROM
`order`
GROUP BY DATE(date_added)) AS o ON o.date = d.date
Ответы: >>973549 >>976692
Аноним 2017/04/14 15:51:42  №973549 7
>>973548
Точнее можно ещё избавиться от одного лишнего селекта в первом селекте
Аноним 2017/04/20 04:06:28  №976692 8
>>973506

зависит от ситуации, что это за данные, что в них может быть, что мы хотим с ними делать.

>>973465
>>973345


> https://ideone.com/DV6lCb

> [8]
Тут скобки не нужны

> \\)\\(\\-\\s
Тут ты задаешь определенный порядок, в котором идут символы. Но они могут ведь идти в любом порядке. надо написать "один из указанных символов", с помощью квадратных скобок, и добавить после этого звездочку.

> '/(\\-|\\s|\\(|\\)|)/';
Зачем тут последняя вертикальная черта? Лишняя ведь.

> /(\\+\\s7)/'
Тут стоит добавить еще что это должно быть в начале

>>973548

Я бы тут использовал IN, а недостающие пустые записи вставил на стороне PHP, если так можно делать.

>>973383

> select from A where id > (select min(id) from B)
> Сколько раз выполнится вложенный запрос? Столько, сколько строк в A? Если да, то можно ли как-то это оптимизировать?
Зависит от используемой базы данных. Некоторые умны, чтобы выполнить вложенный запрос 1 раз, некоторые нет. Проверить в MySQL план выполнения можно через EXPLAIN : https://www.google.ru/search?q=habr+explain+sql&newwindow=1&gbv=1

Оптимизировать можно с помощью переменной в PHP, выбрав первым запросом число, положив в переменную и поставив во второй запрос. В языке SQL тоже есть переменные (@x), но возможности работы сохранения данных из запроса в переменную разные в разных базах данных.

В MySQL ( https://dev.mysql.com/doc/refman/5.7/en/select-into.html ) синтаксис такой:

SELECT MIN(id) FROM table INTO @minValue;
SELECT FROM A WHERE is > @minValue;

В Postgres есть что-то такое: https://www.postgresql.org/docs/9.2/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW