📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/16 в 12:57 |
Предположим, есть только одно Int поле, в котором надо хранить колво лайков и дизлайков. Простой и расточительный подход: первые 2 цифры - это колво лайков, 2 младшие - это кол-во дизлайков.
Пример:
0100 - это есть 01 00, т.е. один лайк, 0 дизлайков
9921 - это есть 99 21, т.е. 99 лайков, 21 дизлайк
Подбный подход не сортируется в MySQL SORT по данному полю в логике формулы
лайки - дизлайки = значение для сортировки.
Т.е. хранить можно, но сортировать логически корректно не получится. Можно ли придумать подход, который и хранить кол-во лайков\дизлайков и при этом сортировка срабатывала бы корректно?
|
|
|
|
С нами с 28.04.10
Сообщения: 61
Рейтинг: 87
|
Добавлено: 10/10/16 в 13:34 |
А если лайков/дизлайков будет больше 100?
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/16 в 13:54 |
Можно взять изначально большего порядка число слепок, пусть будет число с 6-ю нулями для 999 лайков и дизлайков! ХЗ, если привысится и этот лимит, то пусть будет сброс до разницы, т.е. 999100 в момент переполнения сбрасывается до 899000, а 100999 до 000899.
Опять же я привёл изначально плохой пример. Может стоит поиграться с другими системами счисления до заворачивания результата в Int, что будет менее расточительно и решит задачу с сортировкой.
|
|
|
|
С нами с 20.01.03
Сообщения: 18003
Рейтинг: 9760
|
Добавлено: 10/10/16 в 14:45 |
похоже на удаление зуба через жопу
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 10/10/16 в 15:25 |
А почему бы не взять и не сделать 2 инта для таких операций? Учитывая, что лайков много быть не может. Вполне хватит smallint в бд, у которого 2 байта. Делаем его unsigned типа и вот тебе почти 65к лайков. Не думаю что стока когда-либо налайкают. Итак. У нас есть лаки с 2 байтам. Теперь делаем тоже самое с дизлайками. Это тоже 2 байта. Итого 4. Это ровно столько же, сколько и просто int. Без ебических заморочек. + можно сортировать
|
|
|
|
С нами с 09.08.12
Сообщения: 185
Рейтинг: 378
|
Добавлено: 10/10/16 в 16:27 |
SAV писал: | похоже на удаление зуба через жопу |
тестовое задание походу какоето.
в реале такой бред никто не использует.
|
|
|
|
С нами с 09.08.12
Сообщения: 185
Рейтинг: 378
|
Добавлено: 10/10/16 в 16:29 |
S_Flash писал: | Предположим, есть только одно Int поле, в котором надо хранить колво лайков и дизлайков. Простой и расточительный подход: первые 2 цифры - это колво лайков, 2 младшие - это кол-во дизлайков.
Пример:
0100 - это есть 01 00, т.е. один лайк, 0 дизлайков
9921 - это есть 99 21, т.е. 99 лайков, 21 дизлайк
Подбный подход не сортируется в MySQL SORT по данному полю в логике формулы
лайки - дизлайки = значение для сортировки.
Т.е. хранить можно, но сортировать логически корректно не получится. Можно ли придумать подход, который и хранить кол-во лайков\дизлайков и при этом сортировка срабатывала бы корректно? |
нахуя? даже если паковать два числа в одну колонку - вычисляемое поле будет без индекса - а это расчет и нагрузка при каждом запросе.
а так то поле сортировки предварительно вычислять тоже лучше по какото формуле. и не просто вычитанием.
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/16 в 16:38 |
Ailk писал: | А почему бы не взять и не сделать 2 инта для таких операций? |
Как отсортировать по популярности в SQL стиле, в смысле, по лайк - дизлайк?
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/16 в 17:07 |
SAV писал: | похоже на удаление зуба через жопу |
В информатике и системном программировании, где есть элементы связывающие машину с внешним миром очень много таких "зубов". Взять хотябы, как машина работает с десятичными дробями.
Если идти в лоб логики лайков и дизлайков, то задача решается хоть и легко, но очень избыточно, надо хранить 3 поля\столбца в базе (лайк, дизлайк, разница (индекс для сортировки)) и менять одновременно минимум 2. Это возможно но не всегда оптимально.
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/16 в 17:45 |
По сути надо хранить разность двух чисел (это для SQL сортировки), но с возможностью распаковки обратно на уменьшаемое и вычитаемое (для получения числа обоих операций и их общего кол-ва).
Скажу честно, у меня есть вариант алгоритма такого паковщика, но он очень избыточен. Пока не буду его показывать, чтоб не сбить с толку.
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 10/10/16 в 18:52 |
|
|
|
|
С нами с 06.07.04
Сообщения: 476
Рейтинг: 512
|
Добавлено: 11/10/16 в 00:08 |
Задание бредовое, но если очень надо - делаем примерно так:
int = (like-dislike)*10000 + (like*100) + dislike
получаем фактически 3 части - разница (первые 2 знака), лайки (средние 2 знака), дислайки (последние 2 знака), и при этом можем без проблем сортировать "по популярности" штатными средствами.
Да и по любым другим критериям в принципе тоже - например SORT BY SUBSTRING(var,-2) легко сделает сортировку только по дислайкам
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 11/10/16 в 00:13 |
|
|
|
|
Web Developer С++
С нами с 25.11.01
Сообщения: 859
Рейтинг: 759
|
Добавлено: 12/10/16 в 00:53 |
sonata писал: | Задание бредовое, но если очень надо - делаем примерно так:
int = (like-dislike)*10000 + (like*100) + dislike
получаем фактически 3 части - разница (первые 2 знака), лайки (средние 2 знака), дислайки (последние 2 знака), и при этом можем без проблем сортировать "по популярности" штатными средствами.
Да и по любым другим критериям в принципе тоже - например SORT BY SUBSTRING(var,-2) легко сделает сортировку только по дислайкам |
По моему все проще можно сделать:
Пример:
0100 - это есть 01 00, т.е. один лайк, 0 дизлайков
9921 - это есть 99 21, т.е. 99 лайков, 21 дизлайк
1) по лайкам
SELECT .. ORDER BY `X`-`X`%100 DESC
2) по дизлайкам используем остаток от деления
SELECT .. ORDER BY `X`%100 DESC
|
|
|
|
С нами с 06.07.04
Сообщения: 476
Рейтинг: 512
|
Добавлено: 12/10/16 в 22:12 |
DF™ писал: | По моему все проще можно сделать:
Пример:
0100 - это есть 01 00, т.е. один лайк, 0 дизлайков
9921 - это есть 99 21, т.е. 99 лайков, 21 дизлайк
1) по лайкам
SELECT .. ORDER BY `X`-`X`%100 DESC
2) по дизлайкам используем остаток от деления
SELECT .. ORDER BY `X`%100 DESC |
может оно и проще, но по ресурсам вычислять на каждую запись остаток от деления - сильно затратнее чем часть строки вырезать
|
|
|
|
Web Developer С++
С нами с 25.11.01
Сообщения: 859
Рейтинг: 759
|
Добавлено: 12/10/16 в 23:44 |
sonata писал: | может оно и проще, но по ресурсам вычислять на каждую запись остаток от деления - сильно затратнее чем часть строки вырезать |
Не верю! И не забывай что у тебя число изначально, тебе надо его еще перевести в строку прежде чем работать со строками!
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 13/10/16 в 11:22 |
Я думал сделать примерно так:
Хранить разницу как первые две старшие цифры (для сортировки ORDER BY без преобразований), две следующих цифры кол-во лайков, две последних - дизлайков:
122614 - это есть 12 - разница лайки - дизлайки, 26 - лайки, 14 - дизлайки
002427 - это есть 00 - беззнаковая разница, 24 - лайки, 27 - дизлайки
|
|
|
|
Web Developer С++
С нами с 25.11.01
Сообщения: 859
Рейтинг: 759
|
Добавлено: 13/10/16 в 11:42 |
Еще на биты можно разложить по 7, с ними еще проще работать (8+7+7 бит)
На разницу 8 бит и хранить как "128 минус разница", тогда по отрицательной разнице сортировать можно будет.
|
|
|
|