Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/86: Рейтинг темы: голосов - 86, средняя оценка - 4.84
1 / 1 / 1
Регистрация: 21.03.2014
Сообщений: 185

Выборка из mysql из одного столбца по нескольким параметрам

16.06.2014, 23:28. Показов 17351. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

Провожу выборку из таблицы, нужно из одного столбца выбрать значения равные одному и так же второму параметру.
Делаю так, срабатывает только если цифры
PHP
1
$sth = $dbh->prepare("SELECT * FROM `db` WHERE  `col` in (0,1) ORDER BY `id` DESC LIMIT 20");
а если например
PHP
1
$sth = $dbh->prepare("SELECT * FROM `db` WHERE  `col` in ('op1','op2') ORDER BY `id` DESC LIMIT 20");
то уже нет..
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.06.2014, 23:28
Ответы с готовыми решениями:

Как можно найти строки в таблице по нескольким параметрам одного столбца?
Как можно найти строки в таблице по нескольким параметрам одного столбца? Допустим у нас есть: столлбец1, столлбец2, столлбец3 Мне...

Выборка по нескольким параметрам + сложение
Здрасьте! У меня проблемка не могу грамотно составить запрос для выборки по нескольким параметрам SELECT SUM( `o1` ) , SUM( `o1_1` ) ,...

Выборка данных из БД по нескольким параметрам
Здравствуйте, подскажите пожалуйста как можно реализовать запрос для вот такой фильтрации на странице? В принципе у меня есть вот такой...

39
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
18.06.2014, 13:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Cript Посмотреть сообщение
в мануале про пдо сказано что может только один параметр принимать
И ты тоже иди мануал что ли перечитай.
Цитата Сообщение от Programmer_ Посмотреть сообщение
WHERE `col` in ('op1','op2')
Такая запись выдаст все строки где в столбце `col` есть запись op1 либо op2. Но надо понимать что если там скажем op1_op2 она вообще такую строчку пропустит, так как происходит строгое сравнение.
0
1 / 1 / 1
Регистрация: 21.03.2014
Сообщений: 185
18.06.2014, 13:30  [ТС]
Цитата Сообщение от BarbosLV Посмотреть сообщение
Такая запись выдаст все строки где в столбце `col` есть запись op1 либо op2. Но надо понимать что если там скажем op1_op2 она вообще такую строчку пропустит, так как происходит строгое сравнение.
В мане PDO сказано:
> You cannot bind multiple values to a single parameter; for example, you cannot bind two values to a single named parameter in an IN() clause.

Проверял ведь много раз `col` in ('op1') выведет записи из столбца col1, `col` in ('op2') выведет записи из столбца col2, вместе не срабатывает
0
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
18.06.2014, 13:51
Цитата Сообщение от Cript Посмотреть сообщение
Проверял ведь много раз `col` in ('op1') выведет записи из столбца col1, `col` in ('op2') выведет записи из столбца col2, вместе не срабатывает
шта? У меня такое ощущение что мы о разных вещах вообще говорим. Перечитай вот эту статью к примеру.
Цитата Сообщение от Cript Посмотреть сообщение
В мане PDO сказано:
И я тебе ещё раз говорю PDO ни имеет никакого отношения к синтаксису SQL
$sth = $dbh->prepare("SELECT * FROM `db` WHERE `col` in (0,1) ORDER BY `id` DESC LIMIT 20");
0
1 / 1 / 1
Регистрация: 21.03.2014
Сообщений: 185
18.06.2014, 14:02  [ТС]
В таком случае прочтите наконец эту статью
Нельзя привязать несколько значений к одному параметру; например, нельзя привязать два значения к именованному параметру в выражении IN().
0
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
18.06.2014, 14:34
Цитата Сообщение от Cript Посмотреть сообщение
В таком случае прочтите наконец эту статью
Эта статья ни имеет никакого отношения к теме вопроса. Если ты считаешь иначе приведи выдержки из неё и я от души поржу.
0
38 / 38 / 13
Регистрация: 22.07.2013
Сообщений: 197
18.06.2014, 14:35
Я у вас вообще никаких параметров в подготавливаемом запросе не вижу, именованных в том числе.
0
1 / 1 / 1
Регистрация: 21.03.2014
Сообщений: 185
18.06.2014, 14:48  [ТС]
Цитата Сообщение от BarbosLV Посмотреть сообщение
Эта статья ни имеет никакого отношения к теме вопроса. Если ты считаешь иначе приведи выдержки из неё и я от души поржу.
Сколько можно уже выдержки приводить, я уже написал в 24 посте, говорю же почитайте.
Делаю как в примере
PHP
1
2
3
4
5
$params = array('0', $username);
$place_holders = implode(',', array_fill(0, count($params), '?'));
$sth = $dbh->prepare("SELECT * FROM `chat` WHERE `id` > :last_id and `room` = '$room' and `private` IN  ($place_holders) ORDER BY `id` DESC LIMIT 20");
$sth->bindParam(':last_id', $last_id, PDO::PARAM_INT);
$sth->execute();
но выводит ошибку
PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters in
0
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
18.06.2014, 15:13
Цитата Сообщение от Cript Посмотреть сообщение
:last_id
Вот это единственная часть которая возможно имеет отношение к твоему PDO и в ней нет ничего общего с тем что я написал. А так как я не работаю с такими конструкциями я в них и не вмешиваюсь.

Добавлено через 13 минут
То есть если взять первый топик с твоим НЕ РАБОЧИМ примером:
PHP
1
$sth = $dbh->prepare("SELECT * FROM `db` WHERE  `col` in ('op1','op2') ORDER BY `id` DESC LIMIT 20");
И переделать на:
PHP
1
$sth = $dbh->prepare("SELECT * FROM `db` WHERE `col` LIKE '%op1%' AND `col` LIKE '%op2%' ORDER BY `id` DESC LIMIT 20");
То ты получишь то что тебе надо конечно что бы хоть какая то выборка произошла в столце `col` хотябы в одной из строчек болжны присуствовать и op1 и op2 одновременно.
0
38 / 38 / 13
Регистрация: 22.07.2013
Сообщений: 197
18.06.2014, 15:41
Cript, аааа, вот как оно выглядит.
А ошибка в том что ты мешаешь именованные и неименованные параметры, а надо определиться. Либо ВСЕ подготавливаемые параметры вопросиками, либо опять же все, но именованные (aram1, aram2, …). И забиндить их потом тоже ВСЕ.

P.S. Читабельность никакая.
0
1 / 1 / 1
Регистрация: 21.03.2014
Сообщений: 185
18.06.2014, 15:52  [ТС]
Цитата Сообщение от BarbosLV Посмотреть сообщение
$sth = $dbh->prepare("SELECT * FROM `db` WHERE `col` LIKE '%op1%' AND `col` LIKE '%op2%' ORDER BY `id` DESC LIMIT 20");
Повторюсь, это не срабатывает, см. пост 15
0
88 / 88 / 34
Регистрация: 22.05.2012
Сообщений: 404
18.06.2014, 16:03
Цитата Сообщение от BarbosLV Посмотреть сообщение
это или op1 или op2. А ему надо op1 и op2.
Это вы на основании чего сделали такие выводы ?
WHERE `row` IN ( a , b , с ) выдаст выборку по всем полям где `row` равно a,b,c , это не аналог OR . Читайте мануал по mysql.
Cript - А зачем вы используете подготовленные запросы ??? Я понимаю есть в этом смысл если это медленный запрос и его нужно многочисленно выполнять, а так можно жеж просто
PHP
1
2
$query = $db->query( "****" );
        $resource = $query->fetch(PDO::PDO_STATEMENT);
И все будет прекрасно работать
0
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
18.06.2014, 16:11
Цитата Сообщение от Cript Посмотреть сообщение
Повторюсь, это не срабатывает, см. пост 15
Всё я удаляюсь из данной темы. Диалог со стеной получается. Если до тебя не доходит что тебе дали 100% рабочий код SQL-запроса. И если он вдруг не срабатывает значит надо искать причину где то ещё.

Добавлено через 5 минут
Цитата Сообщение от Programmer_ Посмотреть сообщение
Это вы на основании чего сделали такие выводы ?
Ещё один не дочитал тему не понял вопроса и в итоге сморозил глупость.
SQL
1
WHERE `row` IN ( 'a' , 'b' , 'с' )
является 100%-тным аналогом записи:
SQL
1
2
3
WHERE `row`='a'
OR `row`='b'
OR `row`='c'
0
88 / 88 / 34
Регистрация: 22.05.2012
Сообщений: 404
18.06.2014, 16:16
Цитата Сообщение от BarbosLV Посмотреть сообщение
Ещё один не дочитал тему не понял вопроса и в итоге сморозил глупость
Цитата Сообщение от BarbosLV Посмотреть сообщение
является 100%-тным аналогом записи:
Еще один не утруждал себя изучением синтаксиса... Повторюсь читай мануалы http://www.w3schools.com/sql/sql_in.asp
0
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
18.06.2014, 16:23
Цитата Сообщение от Programmer_ Посмотреть сообщение
Повторюсь читай мануалы http://www.w3schools.com/sql/sql_in.asp
Вместо повторений глупостей, забиваешь два приведённых мной варианта и получаешь идэнтичный результат.
0
88 / 88 / 34
Регистрация: 22.05.2012
Сообщений: 404
18.06.2014, 17:22
Лучший ответ Сообщение было отмечено Cript как решение

Решение

Цитата Сообщение от BarbosLV Посмотреть сообщение
Вместо повторений глупостей, забиваешь два приведённых мной варианта и получаешь идэнтичный результат
Имхо глупости это по вашей части. Автору нужно было выбрать значения из одного столбца РАВНЫЕ ( а==b ) нескольким разным параметрам. Оператор mysql LIKE ( в вашем варианте ) выполняет ПОИСК по указанному шаблону, т.е. LIKE %op1% - найдет и вернет значение где == op1 , однако если указать LIKE %op% - вернет все где встречается op т.е. там где op1 , op2 , op3 , op4 , op5 ... Что может привести к некорректной работе программы. Для мультивыборки, (обновления , вставки ) по множественным значениям существует оператор IN который как раз для этого и предназначен т.е. WHERE `s` IN ( a , b , c ) - все значения где s = a , s = b , s = c ,
если будет присутствовать ошибочные входные данные т.е. "op" вместо "op1" запрос ничего не вернет, программа отработает корректно предотвращая ошибку.
Я говорил ранее что ошибка не в самом запросе, нужно копать глубже, + нет смысла использовать подготавливаемые запросы для простой выборки... Но вам походу важнее доказать собственную правоту чем попытаться понять что вы сами пишете.

Добавлено через 19 минут
Вот готовый рабочий "подготовленный" запрос
PHP
1
2
3
4
5
$sth = $db->prepare("SELECT `id` , `name` FROM `test` WHERE `name` IN ( 'user_a' , 'user_b' , 'user_c' ) ORDER BY `id` DESC LIMIT 20");
$sth->execute();
echo "<pre>";
var_dump($sth->fetchAll(PDO::FETCH_OBJ));
echo "</pre>";
Результат
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
array(3) {
  [0]=>
  object(stdClass)#4 (2) {
    ["id"]=>
    string(2) "22"
    ["name"]=>
    string(6) "user_c"
  }
  [1]=>
  object(stdClass)#5 (2) {
    ["id"]=>
    string(2) "12"
    ["name"]=>
    string(6) "user_b"
  }
  [2]=>
  object(stdClass)#6 (2) {
    ["id"]=>
    string(1) "3"
    ["name"]=>
    string(6) "user_a"
  }
}
1
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
18.06.2014, 17:27
Вместо тысячи слов
Миниатюры
Выборка из mysql из одного столбца по нескольким параметрам   Выборка из mysql из одного столбца по нескольким параметрам   Выборка из mysql из одного столбца по нескольким параметрам  

Выборка из mysql из одного столбца по нескольким параметрам   Выборка из mysql из одного столбца по нескольким параметрам   Выборка из mysql из одного столбца по нескольким параметрам  

0
88 / 88 / 34
Регистрация: 22.05.2012
Сообщений: 404
18.06.2014, 17:33
А вот что касается LIKE с ошибкой ввода, вместо user_a - user_
PHP
1
2
3
4
5
$sth = $db->prepare("SELECT `id` , `name` FROM `test` WHERE `name` LIKE '%user_%'  ORDER BY `id` DESC LIMIT 20");
$sth->execute();
echo "<pre>";
var_dump($sth->fetchAll(PDO::FETCH_OBJ));
echo "</pre>";
Результат
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
array(20) {
  [0]=>
  object(stdClass)#4 (2) {
    ["id"]=>
    string(2) "52"
    ["name"]=>
    string(7) "user_77"
  }
  [1]=>
  object(stdClass)#5 (2) {
    ["id"]=>
    string(2) "51"
    ["name"]=>
    string(7) "user_76"
  }
  [2]=>
  object(stdClass)#6 (2) {
    ["id"]=>
    string(2) "50"
    ["name"]=>
    string(7) "user_97"
  }
****
[19]=>
  object(stdClass)#23 (2) {
    ["id"]=>
    string(2) "33"
    ["name"]=>
    string(7) "user_39"
  }
}
0
38 / 38 / 13
Регистрация: 22.07.2013
Сообщений: 197
18.06.2014, 17:59
Programmer_, а зачем подготавливать запрос без параметров? У ТС другая проблема была.

Cript, https://www.cyberforum.ru/php/... ost6335015
0
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
18.06.2014, 18:28
Цитата Сообщение от Cript Посмотреть сообщение
Провожу выборку из таблицы, нужно из одного столбца выбрать значения равные одному и так же второму параметру.
Делаю так, срабатывает только если цифры
Ну значит я не понимаю русскую речь
Если :
параметр1= "user_a"
параметр2= "user_b"
для меня "выбрать значения равные одному и так же второму параметру" значит что ячейка должна содержать и user_a и user_b
0
88 / 88 / 34
Регистрация: 22.05.2012
Сообщений: 404
18.06.2014, 19:31
Цитата Сообщение от Camaro396 Посмотреть сообщение
Programmer_, а зачем подготавливать запрос без параметров? У ТС другая проблема была.
Тут была одна простая проблема - непонятно как - то то ли конь лысый то ли шея не брита...
Автор по видимому решил просто разобраться с PDO.
И проблемой стала мультивыборка средствами MySql PDO, хотя на самом деле разницы в синтаксисе нет никакой, но иногда лишние параметры путают извилины.
Суть была проста, выбрать из таблицы поля ( допустим день рождения ) у пользователей Миша К, Вася Н, Ваня С, Саша Д. и т.д. их может быть бесконечное кол-во... Для этого есть удобный продуманный оператор sql IN который осуществляет выборку ( можно так же обновление ) по списку ( мультивыборку ). Т.е.
SQL
1
SELECT * FROM `users`  WHERE `name` IN ( 'Миша К' , 'Вася Н' , 'Ваня С' ... )
Выбрать все ячейки из полей табл. users где ячейка столбца name = значениям из списка для каждого перечисленного.

Цитата Сообщение от Programmer_ Посмотреть сообщение
Cript - А зачем вы используете подготовленные запросы ??? Я понимаю есть в этом смысл если это медленный запрос и его нужно многочисленно выполнять, а так можно жеж просто
Я о том и говорил ранее... подготовленные запросы -
PHP
1
$sth = $db->prepare(); $sth->execute(); ...
Нужны при выполнении медленных, сложных запросов или при выполнении однообразных ( шаблонных ) запросов с разными параметрами т.е. ( скудный пример из php.net )
PHP
1
2
3
4
5
6
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
$name = 'one';
$value = 1;
$stmt->execute();
Один раз подготовив основной "шаблон" запроса можно в последующем прикручивать к нему все что угодно и выполнять не описывая сам шаблон запроса повторно. + при подготовке запроса сервер БД его оптимизирует 1 раз что ускоряет его обработку. В данном случае достаточно было бы просто
PHP
1
2
$query = $db->query( "SELECT `id` , `name` FROM `test` WHERE `name` IN ( 'user_a' , 'user_b' , 'user_c' ) ORDER BY `id` DESC LIMIT 20" );
$resource = $query->fetchAll(PDO::FETCH_OBJ);
Где-то так...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.06.2014, 19:31
Помогаю со студенческими работами здесь

Выборка из таблицы mysql по двум параметрам
Здравствуйте все! Нужно из таблицы mysql сделать выборку строки по двум значениям. В базе есть таблица со столбцами id, user_wmid,...

Сложный запрос SQL (Деление одного столбца на два по параметрам отбора)
Помогите собрать сложный запрос. Есть таблица типа: |--idShet--|--Command--|--ActPl--| | 409 | 1 | ...

Выборка данных из столбца Mysql
Здравствуйте форумчане!) Столкнулся с такой проблемой. Делаю запрос в БД &lt;?php $res = mysql_query(&quot;SELECT...

Выборка одного столбца матрицы из нескольких равных
Здравствуйте, у меня следующий вопрос. Определить номер столбца матрицы, имеющего максимальную сумму элементов. Если таких столбцов...

Сумма по нескольким параметрам
Таблица (Гонорар): Должность Тип сделки Коэфициент Сотрудник Гонорар Оператор качества Копирайт 8*% Альбина ? ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru