SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.12.2008 20:13:08

Fader
Завсегдатай
Зарегистрирован: 07.05.2008
Сообщений: 54

Запрос для выборки одинаковых значений

Подскажите селект для выборки идентичных (повторяющихся либо похожих) значений в определенном столбике таблицы.

Для примера:
таблица - "table"
столбик - "column"

Спасибо.

Неактивен

 

#2 20.12.2008 23:28:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос для выборки одинаковых значений

Не понятно, что значит похожих. Для выборки повторяющихся значений без повторов:


SELECT `column` FROM `table` GROUP BY `column` HAVING count(*)>1;
 

Для выборки всех повторяющихся значений (с повторами):

SELECT `column` FROM `table` WHERE `column` LIKE (
SELECT `column` FROM `table` GROUP BY `column` HAVING count(*)>1);
 

Неактивен

 

#3 20.12.2008 23:50:07

Fader
Завсегдатай
Зарегистрирован: 07.05.2008
Сообщений: 54

Re: Запрос для выборки одинаковых значений

Пытаюсь выполнить в phpmyadmin тот селект что "Для выборки всех повторяющихся значений (с повторами)"  - получаю ошибку:
#1242 - Subquery returns more than 1 row

Под похожими подразумеваю фразы имеющие одинаковое начало или окончание или "корень":
Firefox 3.0.5 Final
Firefox 3.0.5 Final Russian
Браузер Firefox 3.0.5

Неактивен

 

#4 21.12.2008 01:23:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос для выборки одинаковых значений

Замените LIKE на IN

SELECT `COLUMN` FROM `table` WHERE `COLUMN` IN (SELECT `COLUMN` FROM `table` GROUP BY `COLUMN` HAVING count(*)>1);

Неактивен

 

#5 20.07.2010 18:49:43

Fader
Завсегдатай
Зарегистрирован: 07.05.2008
Сообщений: 54

Re: Запрос для выборки одинаковых значений

Спасибо за запрос. В свое время он мне здорово помог.

Но сейчас проблема возникла снова:

За это время база существенно подросла и запрос выполняется неимоверно долго. (в таблице около 25к строк). Ждал около часа - надоело.

Пытался оптимизировать производительность mysql сервера, надеялся что запрос будет выполняться быстрей - ничего не вышло.

Подскажите как решить проблему?

Спасибо.

Неактивен

 

#6 20.07.2010 19:30:21

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для выборки одинаковых значений

Хм. А вообще подзапрос нужен?

SELECT `colname` FROM `tablename` GROUP BY 1 HAVING COUNT(*) > 1;

Нужен ключик по (`colname`).

Неактивен

 

#7 20.07.2010 21:24:44

Fader
Завсегдатай
Зарегистрирован: 07.05.2008
Сообщений: 54

Re: Запрос для выборки одинаковых значений

Хм... работает! Спасибо!

Только что вы имели ввиду: "Нужен ключик по (`colname`)"?

Неактивен

 

#8 21.07.2010 13:38:41

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для выборки одинаковых значений

Слово «индекс» Вам больше нравится? smile

Неактивен

 

#9 28.07.2010 02:11:35

Fader
Завсегдатай
Зарегистрирован: 07.05.2008
Сообщений: 54

Re: Запрос для выборки одинаковых значений

возникла необходимость усложнить запрос.

К данному селекту нужно добавить условие:
среди повторяющихся значений выбрать нужно то, где дата в столбце 'date' (type=datetime) более поздняя

Неактивен

 

#10 28.07.2010 11:17:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для выборки одинаковых значений

SELECT `colname`, MAX(`date`) FROM `tablename` GROUP BY 1 HAVING COUNT(*) > 1;

Неактивен

 

#11 10.02.2011 18:52:13

nexus
Завсегдатай
Зарегистрирован: 26.11.2010
Сообщений: 35

Re: Запрос для выборки одинаковых значений

А как изменить запрос, если мне надо выбрать только те записи,у которых значение столбца COLUM повторяется у всех элементов с индексом (1-10).
Ну например, имеется таблица



CREATE TABLE IF NOT EXISTS `site_autos_params` (
  `id` int(11) NOT NULL auto_increment,
  `auto_id` int(11) NOT NULL,
  `param_id` int(11) NOT NULL,
  `variant_id` int(11) NOT NULL,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `auto_id` (`auto_id`),
  KEY `param_id` (`param_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;

INSERT INTO `site_autos_params` (`id`, `auto_id`, `param_id`, `variant_id`, `value`) VALUES
(1, 6, 25, 0, 'Белый'),
(2, 5, 25, 0, 'Бронзовый'),
(3, 4, 25, 0, 'Белый'),
(4, 3, 25, 0, 'Белый'),
(5, 1, 25, 0, 'Белый'),
(6, 6, 21, 0, 'Бензин'),
(7, 5, 21, 0, 'Бензин/Газ'),
(8, 3, 21, 0, 'Бензин'),
(9, 7, 21, 0, 'Газ'),
(10, 7, 25, 0, 'Голубой');
 


Мне нужно выбрать те записи у которых auto_id IN ('4', '5', '6', '7') и которые имеют одинаковый param_id.
Т.е. нужно выбрать только те параметры, которые встречаются у всех автомобилей!
Пробывал делать так:


SELECT `auto_id`, `param_id`, `value`
FROM (`site_autos_params`)
WHERE `param_id` IN (SELECT `param_id` FROM site_autos_params GROUP BY `param_id` HAVING count(*)>1)
AND `auto_id` IN ('4', '5', '6', '7')
 


Но этот запрос не правильно отрабатывает. Мне именно надо получить те параметры, которые есть у всех авто!

Неактивен

 

#12 11.02.2011 00:25:29

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для выборки одинаковых значений

Просто посчитайте их. Если количество строк равно четырем, это Ваш случай.
Если меньше — не у всех автомобилей.

Неактивен

 

#13 11.02.2011 09:59:14

nexus
Завсегдатай
Зарегистрирован: 26.11.2010
Сообщений: 35

Re: Запрос для выборки одинаковых значений

Так не получится. Дело в том, что у ондного автомобиля может быть несколько параметров! Причем у одних атвтомобилей они могут отличаться. А мне надо выбрать только те параметры, которые есть у всех атомобилей!

Неактивен

 

#14 11.02.2011 11:57:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для выборки одинаковых значений

Вы знаете количество автомобилей? Знаете. Можете найти параметры, количество
которых совпадает с количеством автомобилей? Можете. В чем проблема? smile

Неактивен

 

#15 11.02.2011 12:04:31

nexus
Завсегдатай
Зарегистрирован: 26.11.2010
Сообщений: 35

Re: Запрос для выборки одинаковых значений

А если не сложно, можете привести хоть примерный запрос. А то я знаю как это сделать на стороне сервера, а вот в MySQL что-то не получается!

Неактивен

 

#16 11.02.2011 13:10:21

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для выборки одинаковых значений

SELECT param_id, COUNT(*) AS c
FROM site_autos_params
WHERE auto_id IN (1,2,3,4)          -- нас интересуют общие параметры у четырех видов машин
GROUP BY 1
HAVING c = 4                            -- тут число должно совпадать с количеством элементов в IN

Неактивен

 

#17 11.02.2011 13:51:19

nexus
Завсегдатай
Зарегистрирован: 26.11.2010
Сообщений: 35

Re: Запрос для выборки одинаковых значений

Да, так я получил param_id, который есть у всех авто, но мне еще надо получить значение этого параметра, для всех авто!

Неактивен

 

#18 11.02.2011 22:18:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для выборки одинаковых значений

SELECT *
FROM site_autos_params
JOIN (SELECT param_id, COUNT(*) AS c
  FROM site_autos_params
  WHERE auto_id IN (1,2,3,4)
  GROUP BY 1
  HAVING c = 4) x USING (param_id)
WHERE auto_id IN (1,2,3,4)

Что-нибудь такое?

Неактивен

 

#19 12.04.2017 03:06:09

Stan
Участник
Зарегистрирован: 12.04.2017
Сообщений: 1

Re: Запрос для выборки одинаковых значений

Добрый день.
Даже не знаю как сформулировать запрос в поисковик, дело в том, что мне нужно получить строки по списку id СО ВСЕМИ повторениями!

Пример:

SELECT * FROM tbl WHERE id IN (1, 1, 1, 2, 2, 5, 6)


Такой запрос выводит 4 строки [1, 2, 5, 6], а нужно вывести все 7 строк, вместе с повторениями [1, 1, 1, 2, 2, 5, 6]

Уверен, решение простое

Неактивен

 

#20 12.04.2017 09:53:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос для выборки одинаковых значений

SELECT * FROM tbl WHERE id =1
union all
SELECT * FROM tbl WHERE id =1
union all
...
SELECT * FROM tbl WHERE id =6


или

select * from (select 1 as id union all select 1 inion all ... select 6) a join tbl using(id);

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson