| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > Не могу отсортировать данные |
| Автор: pavelforever 25.10.2014, 06:47 |
| Сколько не пытался решить эту задачу сам, не получается Итак, есть таблица компаний компании companies | ID | NAME | |----|--------------------| | 1 | Первая компания | | 2 | Вторая компания | | 3 | Третья компания | | 4 | Четвертая компания | | 5 | Пятая компания | мэйлов emails (все мыла уникальны и могут принадлежать разным компаниям) | ID | NAME | |----|---------------------| | 1 | first@fdsfjsfj.dfs | | 2 | second@fdsfjsfj.dfs | | 3 | third@fdsfjsfj.dfs | | 4 | forth@fdsfjsfj.dfs | телефоны phones (все телефоны уникальны и могут принадлежать разным компаниям) | ID | NAME | |----|---------------------| | 1 | +79780000000| | 2 | +79781111111 | | 3 | +79781111222 | | 4 | +79783333333 | связывающая таблица companies_emails | COMPANY_ID | EMAIL_ID | |------------|----------| | 1 | 1 | | 1 | 2 | | 2 | 3 | | 2 | 4 | | 3 | 1 | таблица связывает компании и телефоны companies_phones | COMPANY_ID | PHONE_ID | |------------|----------| | 1 | 1 | | 2 | 2 | | 5 | 2 | Как видно, первая и третья компании имеют один общий мэйл, вторая и пятая - общий телефон. Нужно, чтоб компании выводились обычно по Id, но если мы в процессе вывода видим, что у какой-то из компаний есть общий телефон или мэйл с другой компанией(это мы определяем таблицами companies_emails и companies_phones), выводим сначала её или их, если их несколько. То есть в нашем случае выводим первую компанию, смотрим в таблицы companies_emails и companies_phones, и обнаруживаем, что у этой компании есть "родственная" Третья компания - выводим её (если бы у нее были тоже общие телефоны и эмэйлы с еще невыведенными компаниями, нужно было бы вывести и их). Теперь возвращаемся и выводим вторую компанию, видим, что у нее общий телефон с пятой, выводим пятую, возвращаемся и наконец Четвертую. Как это реализовать в sql? |
| Автор: tzirechnoy 25.10.2014, 11:23 |
| Через self-join/group by/агрегат min(id). |
| Автор: Akina 25.10.2014, 21:17 |
| А теперь без примера чётко и точно сформулируйте, как именно сортировать. Чтобы на любом наборе данных сразу стало понятно, в каком порядке будут идти записи. |
| Автор: pavelforever 25.10.2014, 22:57 | ||
Суть в первом пункте, подробности в остальных: 1. Нужно вывести обычно по id, но если у любой из выводимых компаний увидим общий телефон или мэйл с еще невыведенной компанией, выводим её. 2. Теперь ищем и у этой компании общий тел или мэйл с невыведенными, если находим выводим и повторяем процедуру уже с ней. 3. Если не находим, возвращаемся на предыдущий шаг и ищем еще смежные предприятия. Если опять не находим общих, 4. продолжаем вывод в обычном режиме по id, возвращаясь к первому условию. |
| Автор: Akina 26.10.2014, 09:30 |
| Я же сказал - точно. А это ”описание" даже порядок опорных записей не определяет. |
| Автор: pavelforever 26.10.2014, 21:52 | ||
Приведите пример точной формулировки сложного запроса и я постараюсь сделать как надо |