LINUX.ORG.RU

Запрос sql

 


0

3

Здравствуйте. Имеется таблица:

id   position	vote	category 
1-------0--------2---------3
2-------0--------4---------1
3-------0--------5---------2
4-------0--------1---------3
5-------0--------5---------2
6-------0--------3---------1
...

Как мне сделать sql запрос чтобы в поле position(это позиция товара на сайте, типа топа товара) вбивалось позиция в зависимости от кол-а голосов за товар и категории. То есть если category = 1 то считает все товары в этой категории, и вбивать в поле position их позицию от большего к меньшему (1 место товар с id 2, второе с id 4). Простыми словами - Чтобы на каждый товар в поле position было его место в зависимости от кол-ва голосов(vote) и в каждой категории это подсчитывалось отдельно. Спасибо.

Это не сложно. Нужно просто сделать sql запрос чтобы в поле position(это позиция товара на сайте, типа топа товара) вбивалось позиция в зависимости от кол-а голосов за товар и категории!

aol ★★★★★
()
Ответ на: комментарий от lucky_Star

А ты точно правильно задачу решаешь? У тебя уже есть поле, по которому записи отранжированы — vote. Его достаточно для отображения товаров в нужном тебе порядке. Зачем тебе еще одно поле (position)?

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Мне надо на сайте в топе товаров выводить рядом с каждым товаром его позицию. У кого больше голосов 1 место, дальше 2 место и так далее. Но нюанс в том что категорий много и в каждой надо выводить свою нумерацию.

lucky_Star
() автор топика
Ответ на: комментарий от lucky_Star

Так это обычно делается при отображении, а не на уровне БД.

products = get_all_products()
cats = {}
for p in products:
    cats.get(p.cat, []).append(p)

for c, ps in cats.items():
    println(c)
    i = 1
    ps = sorted(ps, key=lambda x: x.votes, reverse=True)
    for p in ps:
        println('\t', i, p.name)
        i += 1

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

И для этого надо 3ГБ выкачать и переложить в другие 3ГБ? А у них там серверок - всего на 3ГБ. И вся эта прелесть уходит в своп. И отзывчивость всей остальной системы-ниппель становится равна нулю.

Вместо того, чтобы попросить БДшника сразу выплевывать в нужном порядке из процедуры - можно же поистерить, что какое же Г эта ваша БД.

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

Я не понял про твой случай, если честно. Но слабо представляю реальную задачу которую может решать то что хочет воплотить автор темы. Мне кажется, он ее неверно решает и нужно делать как я предложил. Понятно, что мое решение тоже не для масштабов Амазона.

urxvt ★★★★★
()
Ответ на: комментарий от phoenix

Ваш первый комментарий мне и помог в конце концов. Указали мне где искать! Только в моем случае не по rank() а по row_number(). Вот может кому пригодится нумерует не только все поля а так же сортирует по категориям и нумерует отдельно и попорядку в каждой категории:

SELECT
         vote,category,
         row_number() OVER (PARTITION BY category ORDER BY vote DESC)  AS 'position'
       FROM shop
       WINDOW w AS (ORDER BY vote DESC);

lucky_Star
() автор топика
Ответ на: комментарий от lucky_Star

можно поприседать с update where id, но если таблица небольшая может проще сделать create or replace table as (тот самый select). Выше уже указали, что может не нужно результаты сохранять, а просто дергать этот select по необходимости

phoenix ★★★★
()
Ответ на: комментарий от urxvt

Я испугался, что мой любимый питон решили превратить в джаву:

❯ python                                                     
Python 3.11.3 (main, Apr  5 2023, 15:52:25) [GCC 12.2.1 20230201] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> println
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'println' is not defined. Did you mean: 'print'?
>>> exit()

Ему там эта позиция как собаке пятая нога. Сортировка по количеству голосов и проставление номера позиции при выводе в цикле, начиная с (номер страницы - 1) * количество элементов на странице, а если позиция в категории определенной, то тут уже дело пахнет ТЕСТОВЫМ ЗАДАНИЕМ

uwuwuu
()
Последнее исправление: uwuwuu (всего исправлений: 1)

Хорошо у нас есть товары (id, votes, category_id). и вот мы рейтинг категории выводим когда, то выводи товарры с опр category_id отсортированные в DESC по votes. ага. тебе что нужно? вывести товары типа мыло дуру, количество голосов 228 и 11-ое место в категории средства гигиены? зачем??? это за один запрос не сделать… можно написать триггер, который будет при вставке-обноалении пересчитывать места, но тогда придется ОБНОВЛЯТЬ ВСЕ ЗАПИСИ, принадлежащие определенной категории, что не есть хорошо. Это неправильно. ЛИБО СМОТРИ: выводим все товары, отсортировав по votes, например мы их по 10 штук выводим, и делаем подзапросы, считая сколько товаров такой же категории имееют больший рейтинг и текущий будет иметь место = количество товаров той же категории с рейтингом больше + 1

uwuwuu
()
Ответ на: комментарий от uwuwuu

Все верно сортировка DESC по votes но как мне сделать нумерацию то есть чтобы писало не только кол-во голосов в тот DIV но и 1 место, 2 место и так далее... У меня сейчас сортировка по DIV ява скриптом

$('.position').each(function(i) {
    var number = i + 1;
    $(this).prepend(number);
На 1 странице с товарами все четко, и выводит нумерацию, но стоит перейти на 2 страницу, то ява нумерует DIV заново сверху. То есть на 1 стр. 10 товаров 1.2.3... на второй должно быть 11.12.13... а там опять 1.2.3... Мне надо просто пронумеровать весь товар в зависимости от кол-ва голосов за него, и в каждой категории отсчет и нумерация своя. Я пока не понял как это сделать. И это не задание никакое. Я думаю как то апдейтом в базу тупо пронумеровать и запускать на кроне раз в сутки опять нумеровать по голосам, а нумерацию из базы уже выводить в DIV, но может быть как то массив... Но мне проще и легче именно тупо апдейтом товары в базе в каждой категории пронумеровать.

lucky_Star
() автор топика
Ответ на: комментарий от uwuwuu

Дополню. Может как то можно ява скариптом или еще как прицепится к адресной строке и если там ?page=2 то уже нумеровать уже 11,12 а если ?page=3 то 21.22... и так далее. Мне больше ничего и не надо.

lucky_Star
() автор топика
Ответ на: комментарий от lucky_Star

?page=2

Как вариант, из урла распарсить. Но если ты на условном PHP страницу генерируешь то можешь в HTML вывести глобальные переменные (ты же на сервере их знаешь).

<script type="text/javascript>
    var PAGE_SIZE = <?php echo $pageSize; ?>
    var PAGE_NUMBER = <?php echo $pageNumber; ?>
</script>

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Я сейчас думал что можно сделать при нажатии на «Следующая» чтобы в переменную плюсовало и ее подставить, но если зайдут не с 1 страницы то будет каша. Намного лучше пронумеровать сами страницы и уже номер дергать. Шикарная идея спасибо.

lucky_Star
() автор топика
Ответ на: комментарий от urxvt

Спасибо за помощь реально помогли! У меня возникли сложности с вытягиванием с переменной нумерацию страницы (но я обязательно это еще покапаю так как интересно стало) и я распарсил url, лишнее обрезал и потом занулил если в нем значение «1»(так как на 1 странице оно лишнее) и получилось что то вроде такого, может кому пригодится.

<span class="position"></span>
---------------------------------------
	$url = $_SERVER['REQUEST_URI'];
	$url = explode('=', $url);
	$url = $url[1];
	$url + 1;
---------------------------------------
$('.position').each(function(i) {
    var number = i + 1  +   <?php if($url == '1'){ $url =0; } echo $url; ?> * 10;
    $(this).prepend(number);
});

lucky_Star
() автор топика