Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Raisin Zn
101 / 100 / 51
Регистрация: 19.04.2011
Сообщений: 965

Сортировка по одному полю

14.09.2014, 07:17. Показов 1173. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
У меня вопрос по теме сортировки - У кого больше :) - но в ней уже стоит значок - решено, по этому создал новую тему, а не задал вопрос в ней...
В таблице есть поля id, subject, plus, minus, user_id. В полях plus и minus записываются по одной единице либо в plus, либо в minus - в зависимости как проголосовал пользователь за или против. Исходя из этого делаю вывод на главной странице самые популярные, вот так:
PHP
1
2
3
4
5
6
7
8
9
$sql = "SELECT *
    FROM likes 
    ORDER BY plus DESC 
    LIMIT 6";
$query = mysqli_query($connect, $sql) or die(mysqli_error());
$all_top = mysqli_num_rows($query);
$top = array();
while($data = mysqli_fetch_assoc($query))
$tops[] = $data;
По идеи (моей идеи), должны выводится записи с начала с наибольшем количеством единиц, потом меньше, меньше, в общем должно быть 6 записей с самым большим количеством единиц из поля plus. Но допусти, что есть две записи с единицами в поле plus и две записи с единицами в поле minus, так вот выводятся сначала два результата из поля plus, а потом из поля minus - которых там не должно быть...
Пробовал это:
PHP
1
$sql = "SELECT *
менять на:
PHP
1
$sql = "SELECT plus, subject
но ни чего не поменялось...
Подскажите, пожалуйста, где я оступился?
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2014, 07:17
Ответы с готовыми решениями:

Взаимодействие 2-ч БД по одному полю
Уважаемые форумчане проблема вот в чем. Дано: имеется БД mysql с заказами имеется БД mysql с клиентами (имеет 3 столбца: id, имя...

Сортировка по текстовому полю
Помогите плиз, кто может! Есть таблица с полями: INT id VARCHAR author VARCHAR title TEXT content INT genre Вывод...

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

7
21 / 21 / 16
Регистрация: 30.09.2013
Сообщений: 262
14.09.2014, 09:01
Raisin Zn,
Цитата Сообщение от Raisin Zn Посмотреть сообщение
Но допусти, что есть две записи с единицами в поле plus и две записи с единицами в поле minus, так вот выводятся сначала два результата из поля plus, а потом из поля minus - которых там не должно быть...
Цитата Сообщение от Raisin Zn Посмотреть сообщение
LIMIT 6
Естественно, у вас всего 4 записи, и код выводит только первые 6. Вот если бы ты создал 6 записей с + и 2 записи с - , то такого бы не вышло. И к тому же можешь написать:

SQL
1
$sql = "SELECT * FROM likes ORDER BY plus DESC, minus ASC LIMIT 6";
Тут идет сортировка по двум столбцам. Если есть две записи с одинаковым количесвтвом +, то первая выведется только та которая имеет меньшее количество -
1
 Аватар для Raisin Zn
101 / 100 / 51
Регистрация: 19.04.2011
Сообщений: 965
14.09.2014, 09:07  [ТС]
Спасибо!
А можно вообще исключить поле minus?
Как это сделать?
0
21 / 21 / 16
Регистрация: 30.09.2013
Сообщений: 262
14.09.2014, 09:22
И еще один момент:
Цитата Сообщение от Raisin Zn Посмотреть сообщение
В таблице есть поля id, subject, plus, minus, user_id
user_id нужен лишь в одном случае - если в ячейках (plus, minus) этой таблицы не будут хранится числа большие чем 1. В этом случае у нас есть N записей у которых plus = 1, а выводим мы только первые 6, а именно где id=1 -> 6. Выходит что мы не можем на основе этого построить правильную систему рейтинга.

Добавлено через 13 минут
Raisin Zn, Я бы сделал так:
Создаю две таблицы:
id, subject, plus, minus, user_id
и
id, title, text, rating

В первую пишу данные для того что-бы не было накрутки рейтинга
Во вторую пишу данные самих постов, в ячейки rating пишу сумму plus и minus

Цитата Сообщение от Raisin Zn Посмотреть сообщение
А можно вообще исключить поле minus?
В этом случае можно правильно исключить поле minus:
PHP
1
$sql = "SELECT * FROM news WHERE rating>0 ORDER BY rating DESC LIMIT 6";
Правда у тебя может быть какая-то специфическая постановка задачи (об этом ничего не сказано), то тогда вот так можно еще:
PHP
1
$sql = "SELECT * FROM likes WHERE plus>'0' AND minus='0' ORDER BY plus DESC LIMIT 6";
0
 Аватар для Raisin Zn
101 / 100 / 51
Регистрация: 19.04.2011
Сообщений: 965
14.09.2014, 10:21  [ТС]
Цитата Сообщение от -MaZaHaKa- Посмотреть сообщение
user_id нужен лишь в одном случае - если в ячейках (plus, minus) этой таблицы не будут хранится числа большие чем 1
Эта ячейка для проверки голосовал пользователь за данный объект или нет, то есть в эту ячейку записывается ID пользователя, который отдал свой голос за или против.
0
21 / 21 / 16
Регистрация: 30.09.2013
Сообщений: 262
14.09.2014, 15:04
Raisin Zn, это я понимаю. Проще извлечь одно число "rating", чем извлекать каждое "plus" и суммировать. Это будет куда быстрее
0
 Аватар для Raisin Zn
101 / 100 / 51
Регистрация: 19.04.2011
Сообщений: 965
14.09.2014, 16:01  [ТС]
Цитата Сообщение от -MaZaHaKa- Посмотреть сообщение
Это будет куда быстрее
Да, да! Я так уже и сделал... Добавил два поля plus, minus в таблицу photo. Теперь информация о лайках не добавляется, а обновляется. Но таблицу likes оставил, для проверки, голосовал ли пользователь или нет, да и возможно в дальнейшем потребуется вывести список проголосовавших.

На мой взгляд получилось громозго:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
            $sql = "SELECT *
                FROM likes 
                WHERE subject = '$photo' AND user_id = '$user_id'";
            $query = mysqli_query($connect, $sql) or die(mysqli_error());
            
            if (mysqli_num_rows($query) > 0)
            {
                $title = $lang['error'];
                $info = $lang['error_like'];
                require_once(HTML . 'info.html');
                header('Refresh: 3; url=' . $_SERVER['HTTP_REFERER']);
            }
            else
            {           
                $sql2 = "SELECT *
                    FROM photo
                    WHERE photo = '$photo'";
                $query2 = mysqli_query($connect, $sql2) or die(mysqli_error());
                $row = mysqli_fetch_assoc($query2);             
                
                if ($_SESSION['id'] == $row['user_id'])
                {
                    $title = $lang['error'];
                    $info = $lang['error_like_2'];
                    require_once(HTML . 'info.html');
                    header('Refresh: 3; url=' . $_SERVER['HTTP_REFERER']);              
                }
                else
                {           
                    $sql3 = "INSERT INTO likes (subject, plus, user_id)
                        VALUES ('$photo', '$one', '$user_id')";
                    $query3 = mysqli_query($connect, $sql3) or die(mysqli_error());
                
                    $plus = $row['plus'] + 1;
                
                    $sql4 = "UPDATE photo
                        SET plus = '$plus'
                        WHERE photo = '$photo'";
                    $query4 = mysqli_query($connect, $sql4) or die(mysqli_error());
аж четыре запроса подряд. Первым запросом я проверяю голосовал ли пользователь за то, что он собирается голосовать. Втором запросом проверяю не является ли фотография пользователя, что бы он не смог проголосовать за свое фото. Если проверка прошла успешно, то выполняется третий запрос на занесение инфы в таблицу likes, затем четвертым запросом выполняется обновление счетчика в таблице photo.
Много лишнего (каши) наворотил?
0
21 / 21 / 16
Регистрация: 30.09.2013
Сообщений: 262
14.09.2014, 21:28
Raisin Zn, Можно попробовать уменьшить еще вот так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$sql = "SELECT * FROM likes WHERE subject = '$photo' AND user_id = '$user_id'";
$query = mysqli_query($connect, $sql) or die(mysqli_error());
 
$sql2 = "SELECT * FROM photo WHERE photo = '$photo'";
$query2 = mysqli_query($connect, $sql2) or die(mysqli_error());
$row = mysqli_fetch_assoc($query2);
 
if (mysqli_num_rows($query) > 0 || $_SESSION['id'] == $row['user_id']) {
    $title = $lang['error'];
    $info = $lang['error_like'];
    require_once(HTML . 'info.html');
    header('Refresh: 3; url=' . $_SERVER['HTTP_REFERER']);
} else {                     
    $sql3 = "INSERT INTO likes (subject, plus, user_id) VALUES ('$photo', '$one', '$user_id')";
    $query3 = mysqli_query($connect, $sql3) or die(mysqli_error());
 
    $plus = $row['plus'] + 1;
 
    $sql4 = "UPDATE photo SET plus = '$plus' WHERE photo = '$photo'";
    $query4 = mysqli_query($connect, $sql4) or die(mysqli_error());
}
В принципе оно так и есть, на любой CMS, примерно 4 запроса к БД

И еще вот этот участок кода

PHP
1
2
3
4
$title = $lang['error'];
$info = $lang['error_like'];
require_once(HTML . 'info.html');
header('Refresh: 3; url=' . $_SERVER['HTTP_REFERER']);
можно заменить на функцию error($error), например
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.09.2014, 21:28
Помогаю со студенческими работами здесь

Быстрая сортировка структуры по одному полю
Задача такова: Составить программу, в которой будет таблица, которая будет выводится после сортировки ее по значениям в первом столбце. ...

Сортировка данных объекта по одному полю
Мне нужно сделать сортировку в лексикографическом порядке mass -массив строк Что я делаю не так? StringArray *mass5 = new...

Сортировка массива структур по одному полю
Приветствую. Задача: отсортировать по возрастанию структуру по одному полю. Вчера поднимал тему:...

Сортировка массива структур по одному полю
как сортировку по выбранному полю реализовать на си, покажите на каком -нибудь примере? пжлста)

Сортировка массива структур по одному полю
Приветствую. Есть задача, практически аналогичная моей: https://www.cyberforum.ru/cpp-beginners/thread1403598.html В этом примере...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru