Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Akina @ 25.10.2014,  21:17)
А теперь без примера чётко и точно сформулируйте, как именно сортировать. Чтобы на любом наборе данных сразу стало понятно, в каком порядке будут идти записи.

Суть в первом пункте, подробности в остальных:

1. Нужно вывести обычно по id, но если у любой из выводимых компаний увидим общий телефон или мэйл с еще невыведенной компанией, выводим её.
2. Теперь ищем и у этой компании общий тел или мэйл с невыведенными, если находим выводим и повторяем процедуру уже с ней. 
3. Если не находим, возвращаемся на предыдущий шаг и ищем еще смежные предприятия. Если опять не находим общих, 
4. продолжаем вывод в обычном режиме по id, возвращаясь к первому условию.

Автор: Akina 26.10.2014, 09:30
Я же сказал - точно. А это ”описание" даже порядок опорных записей не определяет.

Автор: pavelforever 26.10.2014, 21:52
Цитата(Akina @ 26.10.2014,  09:30)
Я же сказал - точно. А это ”описание" даже порядок опорных записей не определяет.

Приведите пример точной формулировки сложного запроса и я постараюсь сделать как надо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)