MySQL/PHP — столбец SELECT DISTINCT на основе другого столбца с ORDER и LIMIT

спросил

Изменено 2 года, 10 месяцев назад

Просмотрено 652 раза

У меня есть таблица с именем messages , которая выглядит следующим образом:

 +-----+-----------+-------------+ -----+
| идентификатор | отправитель_id | приемник_id | ... |
+-----+-----------+--------------+-----+
| . | . | . | ... |
| . | . | . | ... |
| 120 | 19| 11 | ... |
| 121 | 1 | 3 | ... |
| 122 | 9 | 18 | ... |
| 123 | 2 | 1 | ... |
| 124 | 1 | 24 | ... |
| 125 | 3 | 1 | ... |
| 126 | 7 | 5 | ... |
| 127 | 24 | 1 | ... |
| 128 | 25 | 1 | ... |
| 129 | 1 | 25 | ... |
| 130 | 7 | 3 | ... |
| 131 | 3 | 5 | ... |
+-----+-----------+--------------+-----+
 

Как выбрать последних 3 уникальных пользователей, которые общались с Пользователем 1? Другими словами, как я могу выбрать:

  • различных идентификаторов отправителя, чей идентификатор получателя равен 1 , или различных идентификаторов получателя, чей идентификатор отправителя равен 1
  • в порядке убывания и ограничено 3?

Результат будет выглядеть так:

 +-----+-----------+-------------+-----+
| идентификатор | отправитель_id | приемник_id | . .. |
+-----+-----------+--------------+-----+
| 129| 1 | 25 | ... |
| 127 | 24 | 1 | ... |
| 125 | 3 | 1 | ... |
+-----+-----------+--------------+-----+
 

или просто:

 +----+
| 25 |
| 24 |
| 3 |
+----+
 
  • mysql
  • php
  • phpmyadmin

Test:

 SELECT CASE WHEN sender_id = 1 THEN Receiver_id ELSE sender_id END user_id
ОТ сообщений
ГДЕ 1 В (идентификатор_отправителя, идентификатор_получателя)
СГРУППИРОВАТЬ ПО user_id
ORDER BY MAX(id) DESC LIMIT 3
 

2

1 IN (a,b) не масштабируется. Он выполнит полное сканирование таблицы. Это будет использовать индексы:

 ( SELECT id, Receiver_id FROM messages WHERE sender_id = 1 LIMIT 3 )
СОЮЗ ВСЕХ
(ВЫБЕРИТЕ идентификатор, sender_id ИЗ сообщений, ГДЕ Receive_id = 1 LIMIT 3)
ПРЕДЕЛ 3
 

вместе с обоими

 ИНДЕКС (идентификатор_отправителя, идентификатор_получателя, идентификатор),
ИНДЕКС(идентификатор_получателя, идентификатор_отправителя, идентификатор)
 

Теперь, если вам нужны остальные столбцы для 3 строк:

 ВЫБОР м. *
    FROM ( ... ) AS x -- поместите указанный выше UNION сюда
    ПРИСОЕДИНЯЙТЕСЬ к сообщениям, ИСПОЛЬЗУЯ (id)
 

Вы не сказали, каков ваш «убывающий порядок». Возможно, id ? Возможно, datetime ? id будет немного проще, так что вот:

 SELECT m.*
    ОТ (
            ( ВЫБЕРИТЕ id, Receiver_id ИЗ сообщений, ГДЕ sender_id = 1
                  ORDER BY id DESC LIMIT 3 )
            СОЮЗ ВСЕХ
            ( ВЫБЕРИТЕ id, sender_id ИЗ сообщений, ГДЕ Receiver_id = 1
                  ORDER BY id DESC LIMIT 3 )
            ORDER BY id DESC LIMIT 3 -- да, повторяется
         ) КАК х
    ПРИСОЕДИНЯЙТЕСЬ к сообщениям, ИСПОЛЬЗУЯ (id)
    ORDER BY id DESC -- да, ORDER BY повторяется снова
 

Обсуждение:

  • Каждая сторона UNION может использовать индекс для быстрого поиска запрошенных строк.
  • id предполагается PRIMARY KEY сообщений .
  • Каждый ИНДЕКС является «покрывающим» — все столбцы, необходимые в SELECT , присутствуют в ИНДЕКС .
  • Переход от упорядочения по id к дате и времени нарушает «покрытие», но это можно исправить.
  • Получение 3 строк из каждого подзапроса, а затем снова сокращение до 3 — необходимо для учета различных случаев того, кто кому и когда отправлял электронные письма.
  • Окончательный JOIN нужно посмотреть в BTree данных только 3 раза — это цель «покрытия» и исходной «производной» таблицы (та, что с UNION ).
  • Только для тысяч строк эта сложность не нужна. Но если у вас миллионы строк, то желательно. Для миллиардов строк сложность имеет важное значение.
  • СМЕЩЕНИЕ становится сложнее. Обсуждение здесь: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#or
  • UNION ALL быстрее, чем UNION DISTINCT , и кажется подходящим в этом случае . (Сообщение от пользователя самому себе будет отображаться дважды с ALL .)

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie

.

Заполнение опций раскрывающегося списка, собирающих данные или записи из таблицы mysql

Мы можем получить параметры или элементы списка раскрывающегося списка из таблицы MySQL. Здесь записи, которые мы получим из таблицы, будут использоваться для заполнения выпадающего списка. Таким образом, параметры динамически добавляются в список, таким образом, мы получаем гибкость в выборе параметров. Здесь мы сначала заполним список опциями, взятыми непосредственно из таблицы. Затем мы ограничим параметры, добавив предложение WHERE в оператор SQL, который мы используем для извлечения данных из таблицы.

Посмотрите это видеоруководство по этому скрипту

Например, на первом этапе мы заполняем список именами учащихся. Потом добавим ограничение и будем собирать из таблицы только записи мальчиков. Этот пример можно распространить на любое другое условие, например, на отображение списка штатов с населением, превышающим некоторое значение.

На первом этапе мы узнаем, как получить данные из таблицы MySQL, а затем заполнить поле списка. На втором этапе мы добавим ограничение, используя кнопку точки в поле со списком. Для нашей демонстрации здесь мы будем использовать таблицу учеников, и вы можете скачать / скопировать файл дампа SQL, чтобы создать свою таблицу с данными учеников. Небольшой PHP-код, который мы обсудим, вы можете скопировать и использовать прямо отсюда.

Мы не обсуждаем здесь соединение с частью mysql и предполагаем, что соединение для нас открыто. Здесь вы можете увидеть разные строки подключения mysal, используемые в разных скриптах. Мы начнем с простого SQL-запроса на выборку, используемого для сбора имен и идентификаторов учащихся из таблицы.

 включить "config.
php"; // Подключение к базе данных с использованием PDO
//$sql="ВЫБЕРИТЕ имя,идентификатор ОТ студента";
$sql="ВЫБЕРИТЕ имя,идентификатор ИЗ порядка учеников по имени";
/* Вы можете добавить предложение order by в оператор sql, если имена должны отображаться в алфавитном порядке */
echo "";// Closing of list box

The list box is here Student NameJohn DeoMax RuinArnoldKrish StarJohn MikeAlex JohnMy John RobAsruidTes QryBig JohnRonaldReckyKtyBigyTade RowGimmyTumyuHonnyTinnyJacklyBabby JohnReggidHerodTiddy NowGiff TowCreleaBig NoseRojj BaseTess PlayedReppy RedMarry ToeeyBinn RottKenn ReinGain ToeRows Noump

Выбор только учащихся мужского или женского пола

Используя условие where, мы можем ограничить список показом только студентов мужского пола. Часть SQL здесь.
 $sql="ВЫБЕРИТЕ имя,идентификатор ОТ студента, ГДЕ секс='мужской' заказ по имени "; 
Или мы можем отображать только женские
 $sql="ВЫБЕРИТЕ имя,id ОТ студента, ГДЕ секс='женский', упорядочить по имени"; 

Предварительный выбор опции в раскрывающемся списке

При заполнении списка путем получения данных из таблицы мы можем оставить выбранной одну опцию. например, имя ученика «Большой Джон» должно оставаться выбранным по умолчанию. Для этого мы будем использовать одну проверку условия if внутри цикла, и если она совпадает, мы добавим к этой опции «выбрано».

Здесь показана часть цикла foreach только для того, чтобы показать необходимые изменения в коде.

 foreach ($dbo->query($sql) as $row){//Массив или записи, хранящиеся в $row 
если($строка[id]==10){
echo "";
}иначе{
echo "";
}
}
echo "";// Закрытие списка
В этом коде мы заполняем список один раз во время загрузки страницы. Так что это не условное перечисление. Эту загрузку можно изменить, чтобы список заполнялся в зависимости от действий пользователя.

Использование MySQLi

Подробнее о MySQLi и подключении к базе данных читайте здесь.
 требуют "config.php";// подключение к базе данных
///////////////////////////////
 if($r_set = $connection->query("ВЫБЕРИТЕ * от студента")){

echo "<выберите идентификатор=имя имя=имя>";
в то время как ($ row = $ r_set-> fetch_assoc()) {
echo "";
}
эхо "";
}еще{
эхо $connection->ошибка;
} 

Несколько взаимосвязанных раскрывающихся списков в форме

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

Если производитель автомобиля выбран из одного раскрывающегося списка, то во втором раскрывающемся списке будут перечислены все модели этой конкретной марки.
Заполнение 2-го выпадающего списка на основе выбора 1-го →

Редактирование данных выпадающего списка

В этом примере мы использовали таблицу учеников. Этот сценарий можно интегрировать со сценарием редактирования записи для изменения данных таблицы.

Использование jQuery и JSON

JSON — это строковый формат обмена данными, а в jQuery есть несколько встроенных библиотек JavaScript, чтобы сократить клиентское кодирование. Используя эти два, мы можем заполнить раскрывающийся список.

Заполнение списка данными из таблицы учеников с помощью jQuery →

HTML 5 и список данных

Список данных добавлен в HTML 5. Как и в раскрывающемся списке, пользователи могут выбирать варианты из доступных вариантов и в дополнение к этому они могут добавлять свой собственный текст.
Добавление параметров в список данных с использованием данных из таблицы MySQL →

Поиск и устранение неисправностей

Как создать таблицу учеников?

Используйте приведенный здесь дамп SQL студенческой таблицы, создайте базу данных (если ее нет), а затем создайте таблицу с помощью вашего phpMyAdmin.

Я получаю сообщение об ошибке базы данных

Откройте файл config.php или узнайте больше здесь
Введите правильные данные для входа, идентификатор пользователя и пароль.

Мой раскрывающийся список не заполняется.

  1. Проверьте свой SQL, попробуйте тот же запрос, используя его в вашем PhpMyAdmin.
  2. Проверьте строку подключения, вы должны подключиться с правильным идентификатором пользователя и паролем к соответствующей базе данных, в которой присутствует наша таблица учеников.
  3. Попробуйте сначала отобразить имена учащихся, не сохраняя их в списке.

Запустите этот простой код, чтобы отобразить имя и идентификатор ученика.

 query($sql) as $row) {
echo "$row[id] , $row[name]
"; } ?>
Редактирование и обновление записей, используемых в выпадающем списке → Управление элементами списка с помощью переключателя →
← Подпишитесь на наш канал YouTube здесь

Эта статья написана командой plus2net. com . https://www.plus2net.com


plus2net.com

Подробнее об учебных пособиях по раскрывающимся спискам PHP с демонстрацией

Двойной раскрывающийся список для управления вторым списком на основе выбора первого Включить второй раскрывающийся список после выбора первого списка Двойной выпадающий список часто задаваемых вопросов Управление тремя выпадающими списками Демонстрация двойного выпадающего списка Демонстрация трех выпадающих списков Добавление параметров в список из базы данных Управление параметрами списка с помощью кнопки точки Сохранение значений полей формы после перезагрузки страницы Управление вторым списком с помощью Ajax и PHP Управление тремя списками с помощью Ajax и PHP Выпадающий список с множественным выбором с использованием Ajax

йогеш

17-06-2014

Я хочу получить данные из базы данных в раскрывающийся список с несколькими вариантами выбора с помощью PHP. Чтобы пользователь мог выбрать несколько элементов в этом раскрывающемся списке. Может ли кто-нибудь помочь мне .

Любая помощь приветствуется.
Спасибо.

Ди

15-07-2014

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

include «connection.php»; // Соединение с базой данных с использованием PDO
//$sql=»SELECT name,id FROM student»;
$sql=»ВЫБЕРИТЕ ‘office_name’,’office_code’ ИЗ почтовых индексов»;
/* Вы можете добавить предложение order by в инструкцию sql, если имена должны отображаться в алфавитном порядке */
echo ««;// Закрытие окна списка

?>

Paul Reay

0 -2014

Я обнаружил, что если параметр не выбран, его значение не сохраняется, так что, если я действительно хочу использовать выбранное значение и просто перейти к следующему полю в моей форме, в момент, когда он не сохранит значение.
smo

25-09-2014

Для этого вам нужен Ajax. При этом, когда вы используете вкладку и переходите к следующему полю, значение будет автоматически сохранено без отправки формы. Вы также можете отправить сообщение, в котором пользователю будет предложено выбрать сначала, прежде чем покинуть или отправить форму.
Митч

25-11-2014

большое спасибо
anusha

18-12-2014

plz send me the 4 dropdown list filter search in php using mysql
ross

18-01-2015

I получить пустую коробку без этикетки
Что я делаю неправильно???

$sql=»ВЫБЕРИТЕ поставщика ИЗ «имя_поставщика» заказать по поставщику»;
/* Вы можете добавить предложение order by в оператор sql, если имена должны отображаться в алфавитном порядке */
echo ««;// Закрытие окна списка

В своем запросе вы спрашиваете только одного поставщика столбца, а затем при отображении вы запрашиваете $row[id] и $row[name]. Вы должны выбрать все столбцы, которые вы будете использовать в раскрывающемся списке. Или вы можете вызвать все столбцы, используя подстановочный знак * .
$sql=»ВЫБЕРИТЕ * FROM supplier_name заказать по поставщику»;
шериф

10-02-2015

мне нужна помощь!!! у меня есть два элемента в раскрывающемся списке моей html-страницы. поэтому мне нужно, чтобы, если я выбрал первый элемент в своем раскрывающемся списке, он должен был получить некоторые данные xyz из базы данных, и если я выберу второй элемент из раскрывающегося списка, он должен показать другие детали из ту же базу данных. что я должен сделать для этого….
smo

10-02-2015

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

21-05-2015

Я хочу получить данные из базы данных, выбрав элемент из двух выпадающих списков………….. . Как создать выпадающее меню с номерами id вместо имен
Спасибо. echo «<option value=$row[id]>$row[name]</option>»;
Измените это на
echo «<option value=$row[name]>$row[id]</option>»;
MOnish

11-12-2015

как я могу изменить сценарий в соответствии со своими потребностями ??
kishan

12-12-2015

Sir i can not retrive an image from mysql in dropdownlist
dhananjay

06-06-2016

запись поиска по выпадающему списку из базы данных должна отображаться в формате таблицы
имя моей таблицы gn_user_record.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *