Sql сложные запросы php

Где можно найти примеры очень сложных Sql SELECT запросов?

Есть необходимость покопаться в хардовых SELECT запросах.
Конкретно необходимы запросы с кучей вложенных WHERE EXISTS + OR + AND + IS NULL — ну вы поняли)
Были свои примеры по 60 — 120 строк но я их профукал.

Буду благодарен если кто то поделится ну или даст ссыль на пример.

SELECT products.id, products.name, price.link, price.discount, price.click_count, price.currency, price_currency.name, -- default currency is ruble (@ori_price:=price.price) AS price, -- convertation in dollars ROUND(price.price / , 2) AS dol_price, -- select minimal price for product (@min_price:=( SELECT MIN(price) FROM price WHERE product_id = products.id && id != price.id ) ) AS min_val, -- compare price -- " + 1 - 1" -- mysql трактует извлекаемую инфу как строку -- привести к типу иначе вроде нельзя (@diff:= ROUND( ( @max:=GREATEST(@ori_price + 1 - 1, @min_price + 1 - 1) - @min:=LEAST(@ori_price + 1 - 1, @min_price + 1 - 1) ) / @min * 100, 1 ) ) AS diff, -- если цена товара, меньше это хорошо, больше хуже (IF(@ori_price + 1 - 1 

Но только с большим количеством WHERE условий.

Sanasol

50fd83a7d5e46f16f6442c2c7ed3.png

ищем (наиболее) свободный сервер при заказе хостинга

у каждой услуги есть "вес" который занимается на сервере при аренде.
Суть в том что считаем весь арендованный вес на сервере, и потом выбираем самый свободный для нового заказа.

safenoob

Sanasol

atis2345

safenoob

SELECT CONCAT(p1.id, p1.tvab) + 0 AS tvid, CONCAT(p1.christian_name, " ", p1.surname) AS Name, p1.postal_code AS Code, p1.city AS City, pg.abrev AS Area, IF(td.participation = "Aborted", "A", " ") AS A, p1.dead AS dead1, l.event AS event1, td.suspect AS tsuspect1, id.suspect AS isuspect1, td.severe AS tsevere1, id.severe AS isevere1, p2.dead AS dead2, l2.event AS event2, h2.nurse AS nurse2, h2.doctor AS doctor2, td2.suspect AS tsuspect2, id2.suspect AS isuspect2, td2.severe AS tsevere2, id2.severe AS isevere2, l.finish_date FROM twin_project AS tp /* For Twin 1 */ LEFT JOIN twin_data AS td ON tp.id = td.id AND tp.tvab = td.tvab LEFT JOIN informant_data AS id ON tp.id = id.id AND tp.tvab = id.tvab LEFT JOIN harmony AS h ON tp.id = h.id AND tp.tvab = h.tvab LEFT JOIN lentus AS l ON tp.id = l.id AND tp.tvab = l.tvab /* For Twin 2 */ LEFT JOIN twin_data AS td2 ON p2.id = td2.id AND p2.tvab = td2.tvab LEFT JOIN informant_data AS id2 ON p2.id = id2.id AND p2.tvab = id2.tvab LEFT JOIN harmony AS h2 ON p2.id = h2.id AND p2.tvab = h2.tvab LEFT JOIN lentus AS l2 ON p2.id = l2.id AND p2.tvab = l2.tvab, person_data AS p1, person_data AS p2, postal_groups AS pg WHERE /* p1 gets main twin and p2 gets his/her twin. */ /* ptvab is a field inverted from tvab */ p1.id = tp.id AND p1.tvab = tp.tvab AND p2.id = p1.id AND p2.ptvab = p1.tvab AND /* Just the sceening survey */ tp.survey_no = 5 AND /* Skip if partner died before 65 but allow emigration (dead=9) */ (p2.dead = 0 OR p2.dead = 9 OR (p2.dead = 1 AND (p2.death_date = 0 OR (((TO_DAYS(p2.death_date) - TO_DAYS(p2.birthday)) / 365) >= 65)))) AND ( /* Twin is suspect */ (td.future_contact = 'Yes' AND td.suspect = 2) OR /* Twin is suspect - Informant is Blessed */ (td.future_contact = 'Yes' AND td.suspect = 1 AND id.suspect = 1) OR /* No twin - Informant is Blessed */ (ISNULL(td.suspect) AND id.suspect = 1 AND id.future_contact = 'Yes') OR /* Twin broken off - Informant is Blessed */ (td.participation = 'Aborted' AND id.suspect = 1 AND id.future_contact = 'Yes') OR /* Twin broken off - No inform - Have partner */ (td.participation = 'Aborted' AND ISNULL(id.suspect) AND p2.dead = 0)) AND l.event = 'Finished' /* Get at area code */ AND SUBSTRING(p1.postal_code, 1, 2) = pg.code /* Not already distributed */ AND (h.nurse IS NULL OR h.nurse=00 OR h.doctor=00) /* Has not refused or been aborted */ AND NOT (h.status = 'Refused' OR h.status = 'Aborted' OR h.status = 'Died' OR h.status = 'Other') ORDER BY tvid;

Источник

И всё-таки, как «правильно» выполнять из PHP сложные sql-запросы?

Года три назад попросили меня написать простенькую софтинку на PHP для печати счетов. Так уж получилось, что логика СУБД (MSSQL), на которую опиралась эта софтина, была весьма монструозна — около восьмиста таблиц, перепутанных взаимными связями. Поэтому большинство запросов включали в себя условные вызовы аггрегирующих функций (самое простое — sum(when eq then a else 0 end)), PIVOT\UNPIVOT и тому подобное.

C учетом моего не слишком уж большого опыта на тот момент я решил не ввязываться в data mapping\active record и просто закинул запросы в текстовые файлы, сделал в них текстовые плейсхолдеры типа и написал функцию, заменяющую текст плейсхолдера на значения переменных из ассоциативного массива.

С тех пор прошло много времени — софтинка обзавелась аджаксовой мордочкой, мигрировала на мой любимый CI, обзавелась двумя десятками модулей, содержащих всякую аналитику. Неизменным оставался лишь способ вызова SQL-запросов — ассоциативный массив, текстовый файл, плейсхолдеры.

И, что удивительно, всё это безобразие работает и по сей день. Правда, количество костылей и подпорок уже начинает слегка раздражать.
А именно — ручной escaping, type-checking, в конце концов — не работает ctrl+пробел. Я уж промолчу про то, что отладка запросов нормально не работает из-за «неродных» плейсхолдеров, и syntax check в PhpStorm из-за этого сходит с ума. А вместе с ним и я, потихоньку.

Doctrine на такой сложности запросов превращает двухстрочный вызов в нечто невероятное, а про размер схемы я просто тактично умолчу. Родные плейсхолдеры (:PARAM) не умеют содержать в себе куски запроса. А у нас автогенерация во все поля, кастомные фильтры, отключаемые джойны из внешних СУБД, находящихся за 4-5 тыс км от нашей серверной комнаты. Паника, боль, унижение.

В общем, родился план. Делаем класс Query с тайп-чекингом, возвратом результатов в XML (да, есть и такое) либо в массиве. Дальше делаем кучу наследников для каждого отдельного SQL-запроса, у которых в public -секции висит класс с перечисленными входными параметрами. А дальше всё так же — текстовый файл и плейсхолдеры.

Обратно — либо массивом, либо XML, либо неким классом наподобие ResultSet->First (next,last).

Всё это до боли напоминает изобретение велосипеда. Подозреваю, что всё это уже написано до нас. Но беглый гуглеж не помог. Может, кто сталкивался с такими вещами?

Оценить 1 комментарий

Источник

Сложный запрос

В первую таблицу добавляю города, вторая содержит все направления с километражем.
Если в первой таблице 10 городов, то во второй таблице должно быть 9 записей по одному городу. От одного и того же города, 9 направлений к оставшимся из первой таблицы.

Вопрос в том, как лучше поступить, составить запрос таким образом. Чтобы вывести все направления по каждому городу, которых нет во второй таблице?

Сложный запрос
Здравствуйте! Есть таблица с полями Мне нужно вывести все строки с таблицы, но если есть строки.

Сложный запрос
Помогите прочитать код , совсем не могу понять как проходит проверка ответа. quest.php <? .

Сложный запрос к БД
Всем привет. Подскажите пожалуйста как составить запрос к БД вот такого вида: чтобы в ответ.

Сложный запрос
Делаю поиск по тегам в iamgeboard'е. Есть 3 типа тегов (опционально, т.е. каждый тип может быть.

Сложный запрос
Доброго дня. Не знаю как сделать сложный запрос (Суть его такова, машина берется в аренду на.

Правильней считаю, что хранить лучше в базе. А если необходимо на php, то просто генерировать php код.
С базой проще работать с большим объемом, это необходимо только для администратора.

Возможно составить запрос под данную задачу?

То что в базе хранить это понятно, вопрос где вычислять.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
SELECT c1.id, c2.id, d.klm FROM cities AS c1 LEFT OUTER JOIN cities AS c2 ON c1.id != c2.id LEFT OUTER JOIN directions AS d ON (c1.id = d.id_start && c2.id = d.id_finish) || (c1.id = d.id_finish && c2.id = d.id_start) WHERE d.klm IS NULL

Суть в том чтобы сначала найти все варианты путей, потом прилепить существующие пути и фильтрануть где путей нет.

Работает, только не пойму. Каким образом возможно отфильтровать это?

Если есть Ярославль -> Кострома, то Кострома -> Ярославль уже не нужно, так как километраж будет идентичен.

Эксперт PHP

SELECT DISTINCT IF(a.id > b.id, a.id, b.id) aid, IF(a.id > b.id, b.id, a.id) bid FROM cities a JOIN cities b ON a.id != b.id LEFT JOIN directions c ON (c.id_start, c.id_finish) IN ((a.id, b.id), (b.id, a.id)) WHERE c.distance IS NULL
SELECT DISTINCT IF(a.id > b.id, a.id, b.id) aid, IF(a.id > b.id, b.id, a.id) bid, a.name AS name_s, b.name AS name_f FROM mt_adresa a JOIN mt_adresa b ON a.id != b.id AND b.types IN ('town', 'village') LEFT JOIN mt_distance c ON (c.id_start, c.id_finish) IN ((a.id, b.id), (b.id, a.id)) WHERE c.distance IS NULL AND a.types IN ('town', 'village')

Верно ли прописываю 'and b.types in ('town', 'village')' и 'and a.types in ('town', 'village')' в выборке. Необходимы записи только тех, у которых поле types содержит town и village.

Выбирает верно, просто сомнительно. Одно условие при запросе, второе услове для другой таблицы в выборке. То есть в разных местах.

А так, результат тот же. Что та не выходит совсем

Дело в том, что если в бд нет направления ни туда ни сюда. То выведет 2 строчки и туда и обратно, как только будит что то одно, не выводит второго варианта направления.

Вопрос возможно ли при отсутствии двух направлений, вывести только одну строчку?

Эксперт PHP

ЦитатаСообщение от Gerd199 Посмотреть сообщение

ЦитатаСообщение от Gerd199 Посмотреть сообщение

Вы добавили в SELECT поля a.name и b.name и записи выбираются такими:
1 2 Москва Владивосток
1 2 Владивосток Москва
Потому DISTINCT не отсеивает повторы.

Можно пожалуйста на данном выше примере, перенести условия. Что та затрудняюсь с тем, что все получится у меня с первого раза.

Добавлено через 1 час 1 минуту

ЦитатаСообщение от Para bellum Посмотреть сообщение

Эксперт PHP

Gerd199, вот так попробуйте. Заметьте, что я псевдонимы изменил (с aid на id_from и т.д.), при выводе тоже поменяйте.

1 2 3 4 5 6 7 8 9 10 11 12 13 14
SELECT DISTINCT IF(a.id > b.id, a.id, b.id) id_from, IF(a.id > b.id, b.id, a.id) id_to, IF(a.id > b.id, a.name, b.name) name_from, IF(a.id > b.id, b.name, a.name) name_to FROM mt_adresa a JOIN mt_adresa b ON b.id != a.id LEFT JOIN mt_distance c ON (c.id_start, c.id_finish) IN ((a.id, b.id), (b.id, a.id)) WHERE c.distance IS NULL AND a.types IN ('town', 'village') AND b.types IN ('town', 'village')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
SELECT DISTINCT IF(a.id > b.id, a.id, b.id) id_s, IF(a.id > b.id, a.name, b.name) name_s, IF(a.id > b.id, a.country, b.country) country_s, IF(a.id > b.id, a.region, b.region) region_s, IF(a.id > b.id, a.district, b.district) district_s, IF(a.id > b.id, a.town, b.town) town_s, IF(a.id > b.id, a.village, b.village) village_s, IF(a.id > b.id, a.selo, b.selo) selo_s, IF(a.id > b.id, a.posolok, b.posolok) posolok_s, IF(a.id > b.id, a.dist_town, b.dist_town) dist_town_s, IF(a.id > b.id, b.id, a.id) id_f, IF(a.id > b.id, b.name, a.name) name_f, IF(a.id > b.id, b.country, a.country) country_f, IF(a.id > b.id, b.region, a.region) region_f, IF(a.id > b.id, b.district, a.district) district_f, IF(a.id > b.id, b.town, a.town) town_f, IF(a.id > b.id, b.village, a.village) village_f, IF(a.id > b.id, b.selo, a.selo) selo_f, IF(a.id > b.id, b.posolok, a.posolok) posolok_f, IF(a.id > b.id, b.dist_town, a.dist_town) dist_town_f FROM mt_adresa a JOIN mt_adresa b ON b.id != a.id LEFT JOIN mt_distance c ON (c.id_start, c.id_finish) IN ((a.id, b.id), (b.id, a.id)) WHERE c.distance IS NULL AND b.types ".($t = "IN ('district', 'town', 'town', 'village', 'selo', 'posolok', 'dist_town')")." AND a.types {$t} LIMIT 35 OFFSET ".intval(30*$data['count'])

Жестко получилось, но вроде все работает, завтра сяду. Буду тестить да проверять. Спс. А сгруппировать поля хотел тут, когда еще 2 условия всего навсего было. Теперь вижу, что тут ничего не сделать?

Эксперт PHP

Да, это не то. Лучше тогда два запроса делать: с помощью первого получать только идентификаторы, с помощью второго получать остальные данные по этим ID.

В PostgreSQL можно было бы указать, по каким именно столбцам делать DISTINCT. А MySQL только со всей строкой работает.

Сложный SQL запрос
Добрый день! Подскажите пожалуйста вот такой вот запрос: есть 2 таблицы в 1й links поля id .

Сложный mysql запрос
Здравствуйте дорогие мои друзья. Есть таблица где данные берутся из mysql и она состоит.

Сложный SQL запрос
Здравствуйте! Я делаю имиджборд и пытаюсь сделать поиск по картинкам пользователей. Так я.

Сложный запрос MySQL
Как в одном запросе извлечь данные о неких элементах в таблице, и попутно с других таблиц прицепить.

сложный запрос к БД (MySQL)
Помогите сформировать запрос. есть бд. в ней с десяток таблиц. в каждой таблице есть поле date. .

Источник

Читайте также:  User input alert javascript
Оцените статью