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

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

14.09.2014, 07:17. Показов 1146. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru