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 или узнайте больше здесь
Введите правильные данные для входа, идентификатор пользователя и пароль.
Мой раскрывающийся список не заполняется.
- Проверьте свой SQL, попробуйте тот же запрос, используя его в вашем PhpMyAdmin.
- Проверьте строку подключения, вы должны подключиться с правильным идентификатором пользователя и паролем к соответствующей базе данных, в которой присутствует наша таблица учеников.
- Попробуйте сначала отобразить имена учащихся, не сохраняя их в списке.
Запустите этот простой код, чтобы отобразить имя и идентификатор ученика.
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 ?> |
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=»ВЫБЕРИТЕ поставщика ИЗ «имя_поставщика» заказать по поставщику»; /* Значения опций добавляются в цикле по массиву */ | |
В своем запросе вы спрашиваете только одного поставщика столбца, а затем при отображении вы запрашиваете $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. |