Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная сортировка / 17 сообщений из 17, страница 1 из 1
25.10.2014, 07:02:10
    #38787151
pavelforever
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
Сколько не пытался решить эту задачу сам, не получается
Итак, есть таблица компаний
компании 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?
...
Рейтинг: 0 / 0
25.10.2014, 20:00:23
    #38787313
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
авторСколько не пытался решить эту задачу сам, не получаетсянаправьте на вашу мысль, покажите как вы пытались...
...
Рейтинг: 0 / 0
26.10.2014, 00:13:38
    #38787410
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
ещо тадобно уточнить...
если я вывел компанию 1 с мылом 1 и телефоном 1

у компании 2 телефон 1
а у компании 3 мыло 1

какая компания должна ити после первой? та где совпал только телефон, или та где только мыло?
...
Рейтинг: 0 / 0
26.10.2014, 00:16:06
    #38787411
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
а если 1000 компаний, у всех уникальные мылы и телефоны, вот они списком идут...

1001 телефон совпал с 100 компанией скажем...мы её тогда должны после сотой выдать...но её мыло (1001 компании ) совпадает с 999.

и вот вопрос 999 надо на 102 место ставить или нет?
...
Рейтинг: 0 / 0
26.10.2014, 00:20:25
    #38787414
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
а зачем делать вывод компаний по йади(а если не по айди а случайно...пользователь это както заметит?)


но если совпало мыло или телефон тулить следом...

вот идёт 1 компания, есть 300 компаний с такимже телефоном, их ставить после первой?

а на каждую из 300 есть ещо 100 компаний с совпавшим мылом...если их тоже следом выводить...в чом смысл тогда такого вывода?

мдя паша...незнаю что ты там пытался...но поидее былиб попытки..прежде всего бы понял что задача не сформулирована доконца
...
Рейтинг: 0 / 0
26.10.2014, 00:28:12
    #38787416
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
а в целом для такой ереси....

для простоты расмотрим список - айди, номер телефона

и вот нам надо по айди, но если совпадает телефон то следом...

получаем таблицу(подзапрос)
номер телефона, мин(айди)

потом клеим базовую таблицу ТБ с вотэтой псевдо ТП, связь по совпадению номера телефона

и получаем ещо один столбик для сортировки

ТП.айди_ИБ.айди

и вот сортируя по этому столбику, получим то что надо...
айди - номер телефона
1 1233
2 2233
3 1233
4 2233

ТП будет
1233 1
2233 2

клеим и строим новый стобки
1 1233 1_1
2 2233 2_2
3 1233 1_3
4 2233 2_4

сортируя по новому столбику получим то что надо
...
Рейтинг: 0 / 0
26.10.2014, 00:47:25
    #38787422
pavelforever
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
alex564657498765453ещо тадобно уточнить...
если я вывел компанию 1 с мылом 1 и телефоном 1

у компании 2 телефон 1
а у компании 3 мыло 1

какая компания должна ити после первой? та где совпал только телефон, или та где только мыло?
В идеале та, где больше совпадений, если одно и там и там, то та, которая первая попалась, а вообще это неважно, главное, чтоб все смежные оказались рядом
...
Рейтинг: 0 / 0
26.10.2014, 00:48:45
    #38787423
pavelforever
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
Alex_Ustinov,

я пытался найти способ, до кода так и не дошло. Был еще вариант при добавлении компаний находить общие и связывать отдельной таблицей, но пока его не рассматриваю. Думаю, как-то это можно сделать с помощью case или переменных (но они для меня пока темный лес).
...
Рейтинг: 0 / 0
26.10.2014, 00:52:37
    #38787424
pavelforever
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
alex564657498765453а если 1000 компаний, у всех уникальные мылы и телефоны, вот они списком идут...

1001 телефон совпал с 100 компанией скажем...мы её тогда должны после сотой выдать...но её мыло (1001 компании ) совпадает с 999.

и вот вопрос 999 надо на 102 место ставить или нет?
да, после сотой, дальше проверяем ее на смежность, находим 999-ую и ставим её 102-ой, у этой 999-ой тоже ищем смежные, если не находим, идем по списку, находим - ставим 103-ей
...
Рейтинг: 0 / 0
26.10.2014, 00:57:51
    #38787427
pavelforever
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
alex564657498765453а зачем делать вывод компаний по йади(а если не по айди а случайно...пользователь это както заметит?)


но если совпало мыло или телефон тулить следом...

вот идёт 1 компания, есть 300 компаний с такимже телефоном, их ставить после первой?

а на каждую из 300 есть ещо 100 компаний с совпавшим мылом...если их тоже следом выводить...в чом смысл тогда такого вывода?

мдя паша...незнаю что ты там пытался...но поидее былиб попытки..прежде всего бы понял что задача не сформулирована доконца

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

все предложения верны. смысл в том, чтоб смежные компании были рядом.. вряд ли их одинаковых будет так много
...
Рейтинг: 0 / 0
26.10.2014, 03:59:12
    #38787457
pavelforever
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
alex564657498765453
и вот нам надо по айди, но если совпадает телефон то следом...

с помощью чего это лучше делать? case, if или есть что-то лучше?
...
Рейтинг: 0 / 0
26.10.2014, 14:34:18
    #38787574
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
pavelforever,
вы итоговый запрос сделайте, а там будет видно как упорядочивать... Ваш запрос покажите....
...
Рейтинг: 0 / 0
26.10.2014, 21:29:06
    #38787731
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
pavelforeveralex564657498765453а если 1000 компаний, у всех уникальные мылы и телефоны, вот они списком идут...

1001 телефон совпал с 100 компанией скажем...мы её тогда должны после сотой выдать...но её мыло (1001 компании ) совпадает с 999.

и вот вопрос 999 надо на 102 место ставить или нет?
да, после сотой, дальше проверяем ее на смежность, находим 999-ую и ставим её 102-ой, у этой 999-ой тоже ищем смежные, если не находим, идем по списку, находим - ставим 103-ей

ну вот это уже точно ересь!


расмотрим вкачестве записей в базу данных числа от 10 до 99

всё число это как бы айди записи - тоесть вывод по айди, - = вывод по порядку.

первая цифра это номер телефона, вторая мыло...

итак гуляем по вашей логике.

первая 10

дальше - нет компаний с цифрами 1 и 0.

есть 8 компаний с похожим мылом - 20 30 40 50 60 70 80 90

и есть 9 с совпавшим телефоном 11 12 13...

что ставим? допустим телефон важнее

значит 10 11, потом 12 13 19.... теперь уже с похожим телефоном нету есть с мылом похожим
29 39 49 ...

ставим 29, теперь есть куча с похожим телефоном 20 21 22 .... дойдём до 28, опять ставим
с похожим мылом - ....

короче ересь в чистом виде получаеться... а главное - процес явно циклический...

тоесть пока весь список по кокойто логике не отсортировали, продолжать...

если кто не предумает эвристику для такой сортировки...то задача явно не для субд.
...
Рейтинг: 0 / 0
26.10.2014, 23:33:15
    #38787761
pavelforever
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
не понял вот этого в рассуждении
alex564657498765453первая цифра это номер телефона, вторая мыло...

дальше - нет компаний с цифрами 1 и 0.

а если сделать одно поле для объединения, такое возможно в sql? Т.е. аналогично тому, если бы отсортировать нужно было бы только по общему мэйлу..
...
Рейтинг: 0 / 0
27.10.2014, 07:04:12
    #38787808
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
pavelforever, да какая разница? у вас явно циклическая задача (запись результата номер N зависит от данных в записи результата номер N-1), ну так и делайте цикл:

1) выбрать первую запись (селект ... лимит 1) и сбросить её во временную таблицу;
2) выбрать очередную запись (селект ... где мыло похожее или телефон похожий (а если таких нет, то селект из п.1), и запись не была выбрана на предыдущих шагах - ... лимит 1);
3) повторять предыдущий пункт до исчерпания записей в исходной таблице или до достижения нужного объёма выборки.

Долго? да
Криво? да
Не одним запросом? да
Ну а чего вы хотели с такой постановкой?
...
Рейтинг: 0 / 0
27.10.2014, 12:20:44
    #38788040
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
pavelforeverне понял вот этого в рассуждении
alex564657498765453первая цифра это номер телефона, вторая мыло...

дальше - нет компаний с цифрами 1 и 0.

а если сделать одно поле для объединения, такое возможно в sql? Т.е. аналогично тому, если бы отсортировать нужно было бы только по общему мэйлу..


всёже елементарно ватсон

у нас таблица

номер телефона и мыло (щитай что это цифры от 0 до 9

айди(первичный ключ) мы стриом как пару телефон+мыло.

вот и получаем таблицу

10 1 0
11 1 1
айди телефон мыло

сортируем по айди.
первая запись
10 1 0

договорились что записи у нас до 99

ещо есть компании где телефон равен 1, а мыло 0???
нету(числа состоящего из цифр 1 и 0 между 11 и 99 нету

теперь для этой записи ищем покожие телефоны

11 1 1
есть запись с похожим и номером и мылом(число между 12 99 состоящее только из 1иц) нету

дальше
12 1 2
...
19 1 9
больше нету компаний с похожим телефоном(первая 1 среди чисел 20 -99)

но есть компании с похожим мыло(заканчиваеться на 9)

первая
29 2 9

но теперь есть с похожим телефоном(первая 2) а мы условились что телефон важнее

20 2 0
21 2 1
...
Рейтинг: 0 / 0
27.10.2014, 12:30:19
    #38788070
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка
хотя пример чисел показывает наглядно, как получиться итоговая сортировка

а именно

10
11
12
..
19
29
20
..
28
38
30
..37
39
49
40
..
48

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

продолжая предыдущую идею


получим таблицу мин_айди_для_телефона+реальный_айдизаписи

мы отсортируем с привязками по телефону.

терь надо мыло приркутить както...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная сортировка / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]