[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySQL - Выбор позиций с группированием по признаку
masterlelik
Просьба помочь написать запрос или несколько запросов.

Есть одна таблица со школами:
Каждая школа может иметь принадлежность к какой-то сети.
Необходимо выбирать по 10 штук на странице таким образом, чтоб если найдена хотя бы одна школа какой-то сети, то были бы выбраны все школы этой сети (network_id=1), но они не считались бы в те 10, которые указаны в limit 10.
Только первая школа одной сети входит в десять, остальные идут как бонус. А network_id=0 считаются как уникальные школы и они не должны ни с кем группироваться.
В итоге результатом запроса может быть 15 записей, 8 из которых имеют network_id=0, 4 с network_id=1, 3 с network_id=2
Расшифровка limit 10 в данном варианте это 8 с network_id=0 , одна с network_id=1 и одна network_id=2, остальные как бонус.
Сортировка по заголовку.
И второй момент, если будет вторая страница (limit 10, 10), то если на первой странице уже выбирались школы с network_id>0 (например с network_id=1), то их не должно выбрать т.к. они все были отображены на первой странице.

P.S. в самом начале я писал "Необходимо выбирать по 10 штук на странице", а чуть ниже расписал в примере 15 штук. Это не ошибка, на странице будет 10 блоков, только в блоках с network_id>0 будут кнопки для отображения ВСЕХ школ из одной сети в этом блоке, в блоке будет меняться картинка и название. А для школ с network_id=0 в блоке всегда статически будет одна школа.

_____________
SorokinFilipp265
в подобных случаях можно написать скрипт, который через планировщик задач будет периодически формировать нужный список, либо список будет формироваться при каждом изменении школ и связей школа-сеть

но можно и сразу сформировать и вывести список

сортировка по заголовку - то есть по заголовку школы? а если школ несколько то по заголовку "с наименьшим заголовком" из них?
masterlelik
Цитата (SorokinFilipp265 @ 21.07.2019 - 18:56)
сортировка по заголовку - то есть по заголовку школы? а если школ несколько то по заголовку "с наименьшим заголовком" из них?

Да, все верно. По "меньшему" заголовку

_____________
SorokinFilipp265
ну тогда можно скриптом выбрать уникальные network_id

SELECT DISTINCT(network_id) FROM таблица_школ


, потом по каждому network_id кроме 0

foreach($array as $network_id) {
$row = функция чтения ряда из бд (SELECT имя_школы FROM таблица_школ WHERE network_id = $network_id ORDER BY имя_школы ASC LIMIT 1)
}


выполнить запрос с поиском школ, выбрать "наименьшее название", построить таблицу

network_id => min_name_school

в неё же добавить школы с network_id = 0

затем по этой таблице можно делать селекты

select * from tablica order by min_name_school ASC LIMIT 10,10
Kusss
Упаси спрашивающих от таких советов . mad.gif
FatCat
Я вижу выход в создании еще одной таблицы: айдишники школ и текстовое поле с айдишниками связанных школ через запятую.
В первом поле может быть только наименьший айдишник одной сети.

Генерить эту таблицу заново при каждом добавлении новой школы, или искать и редактировать при добавлении новой сетевой школы — зависит от размера таблицы. Первое лучше, но при большом объеме данных может потребовать слишком больших ресурсов.

_____________
Бесплатному сыру в дырки не заглядывают...
SorokinFilipp265
Цитата (Kusss @ 22.07.2019 - 15:29)
Упаси спрашивающих от таких советов .  mad.gif

если человек критикует чужое решение, но не предлагает своё более лучшее, значит он врёт
Kusss
SorokinFilipp265
Запросы в цикле - ЗЛО. Не предлагай такое использовать, и сам откажись если где есть.

masterlelik
Можно подробнее:
Цитата
Необходимо выбирать по 10 штук на странице таким образом, чтоб если найдена хотя бы одна школа какой-то сети, то были бы выбраны все школы этой сети (network_id=1), но они не считались бы в те 10, которые указаны в limit 10.
На странице много школ и можно выбрать только 10, а потом эти 10 выбранных (id ?) отправляются запросом на сервер ?
Нужен ли вообще php, если это можно сделать на js (при условии что ВСЕ школы на странице)
Цитата
Только первая школа одной сети входит в десять, остальные идут как бонус. А network_id=0 считаются как уникальные школы и они не должны ни с кем группироваться.
Это вообще не понятно.
Да, ещё не понятно что подразумевается под группировкой, судя по тексту это "сортировка".
SorokinFilipp265
Цитата (Kusss @ 22.07.2019 - 18:14)
Запросы в цикле - ЗЛО. Не предлагай такое использовать, и сам откажись если где есть.

я вам предлагаю в вашей фразе исправить слово "такое" на слово "их"

а когда вы окончите 5й класс школы и будете знать русский язык, тогда и поговорим про циклы
Valick
SorokinFilipp265, перед тем как спорить с "пятиклассником", тебе не мешало бы хотя бы поступить в школу smile.gif
ТС написал белиберду, вот мы и не лезем с советами. На лицо полное отсутствие базовых и теоретических знаний, пытаться помогать в таком случае себе дороже и лезть с советами сюда может только тот, у которого этих базовотеоретических знаний чуть больше чем ноль.


_____________
Стимулятор ~yoomoney - 41001303250491
SorokinFilipp265
Kusss

я поел кошачий корм вискас, меня прохватил понос, я подобрел

да, объединение запросов к бд может помочь сократить время выполнения php скрипта, так как каждый запрос проходит проверку, оптимизацию, предположу даже очередь запросов, то есть может потеряться до 1 секунды на каждом запросе к бд

ну допустим таблица имеет следующие поля

id, name, desc, network_id

можно найти уникальные network_id и сразу к ним минимальное значение "имя школы"

SELECT nid, c FROM ( SELECT distinct a.network_id  as nid, (SELECT MIN(b.name) FROM `таблица_школ` b WHERE b.network_id=a.network_id) c FROM `таблица_школ` a WHERE a.network_id != 0 ) d ORDER BY c

и вторым запросом получить школы без network_id

SELECT network_id as nid, name as c FROM `таблица_школ` WHERE network_id=0 ORDER BY name

эти 2 запроса можно объединить

(SELECT nid, c FROM ( SELECT distinct a.network_id  as nid, (SELECT MIN(b.name) FROM `таблица_школ` b WHERE b.network_id=a.network_id) c FROM `таблица_школ` a WHERE a.network_id != 0 ) d ORDER BY c)
UNION
(SELECT network_id as nid, name as c FROM `таблица_школ` WHERE network_id=0 ORDER BY name)
SorokinFilipp265
Цитата (Kusss @ 22.07.2019 - 18:14)
Нужен ли вообще php, если это можно сделать на js (при условии что ВСЕ школы на странице)

чтобы вытащить данные из бд php применяется, но вы конечно можете сказать, что вместо бд данные могут храниться в json файле

чтобы отсортировать данные и нарисовать нужную автору темы страницу скорее всего не нужен, при условии что объём данных небольшой и браузер не начнёт тормозить
SorokinFilipp265
Valick
вы правы, в школу я не поступил, так как учительница (которая выступала в роли приёмной комиссии) задавала среди прочих вопросов вопросы из ряда "на шахматной доске белые и чёрные фигуры. какой цвет шахмат?" к сожалению я не знаю, какой цвет шахмат, если их два. поэтому и не был принят.
Valick
SorokinFilipp265, да все на этом вопросе погорели, не ты один такой одарённый


_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.