Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из БД определённых данных. 
V
    Опции темы
savmp
  Дата 25.1.2012, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 260
Регистрация: 27.7.2009
Где: Геленджик

Репутация: -2
Всего: -16



Здравствуйте!

ЕСТЬ база данных и 2 поля в ней

ID и DATE
1      Y-3784
2      Y-5674
3      N-7908
4      Y-4672
5      N-5637
6      Y-5634
7      N-6676

ПОДСКАЖИТЕ как задать запрос к базе данных
который бы мне вытащил все строки где начало строки начинается с буквы Y

После чего я буду использовать цыкл.

Большое вам спасибо!
PM MAIL ICQ   Вверх
$дмитрий
Дата 25.1.2012, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 1
Всего: 45



Код

SELECT * FROM `table` WHERE `DATA` LIKE 'Y%'


Это сообщение отредактировал(а) $дмитрий - 25.1.2012, 20:15
PM MAIL   Вверх
Gold Dragon
Дата 26.1.2012, 07:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: нет
Всего: 71



или так
Код

SELECT * FROM `table` WHERE `DATA` REGEXP "^Y"


Если нужно учитывать регистр, то можно так
Код

SELECT * FROM `table` WHERE `DATA` LIKE BINARY 'Y%'

или 
Код

SELECT * FROM `table` WHERE `DATA` REGEXP "^[Y]"

или 
Код

SELECT * FROM `table` WHERE `DATA` REGEXP BINARY "^Y"


Это сообщение отредактировал(а) Gold Dragon - 26.1.2012, 07:31


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
savmp
Дата 26.1.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 260
Регистрация: 27.7.2009
Где: Геленджик

Репутация: -2
Всего: -16



А КАК СДЕЛАТЬ ТАКОЕ

ID   DATA_A   DATA_A   DATA_A   NAME 

1     Y-9890    Y-1178    N-0390   ФИРИА-1
2                    Y-7878    N-6350   ФИРИА-2
3     N-9090                   N-3390   ФИРИА-3
4     Y-7800    N-2333                  ФИРИА-4
5                                    Y-8909   ФИРИА-5


то есть в одной строке есть 3 столбца DATA_A   DATA_A   DATA_A
Нужно вытягивать строки где начало начинается на Y
результат должен быть таким

1   Y-9890   ФИРИА-1
1   Y-1178   ФИРИА-1
2   Y-7878   ФИРИА-2
4   Y-7800   ФИРИА-4
5   Y-8909   ФИРИА-5

СПАИБО

Это сообщение отредактировал(а) savmp - 26.1.2012, 16:06
PM MAIL ICQ   Вверх
$дмитрий
Дата 26.1.2012, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 1
Всего: 45



Перечисли условия через OR
PM MAIL   Вверх
savmp
Дата 26.1.2012, 18:40 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 260
Регистрация: 27.7.2009
Где: Геленджик

Репутация: -2
Всего: -16



Цитата($дмитрий @ 26.1.2012,  18:00)
Перечисли условия через OR

ПОДСКАЖИ КАК??? Я все варианты перепробовал... но в цыкле ничего не получается.
PM MAIL ICQ   Вверх
Valinur
Дата 26.1.2012, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 21.9.2007
Где: Москва

Репутация: нет
Всего: 6



Как минимум 3 столбца не могут иметь одинаковое имя, пусть будут ID   DATA_A1   DATA_A2   DATA_A3   NAME 

Тогда запрос
Код

SELECT id, data_a1 as data_a, name FROM table WHERE data_a1 LIKE 'Y%'
UNION
SELECT id, data_a2 as data_a, name FROM table WHERE data_a2 LIKE 'Y%'
UNION
SELECT id, data_a3 as data_a, name FROM table WHERE data_a3 LIKE 'Y%'

Это на самом деле худший вариант, т.к. всю таблицу движку придется пройти 3 раза.
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Gold Dragon
Дата 26.1.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: нет
Всего: 71



Цитата(savmp @  26.1.2012,  19:40 Найти цитируемый пост)
цыкле
цикле  smile 



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
skyboy
Дата 27.1.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата($дмитрий @  25.1.2012,  19:13 Найти цитируемый пост)
LIKE 

Цитата(Gold Dragon @  26.1.2012,  06:30 Найти цитируемый пост)
REGEXP 

ребят, вы чего? а слабо использовать substr?
PM MAIL   Вверх
krundetz
Дата 27.1.2012, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: нет
Всего: 69



Цитата(savmp @  26.1.2012,  18:40 Найти цитируемый пост)
Я все варианты перепробовал... но в цыкле ничего не получается. 

во многих ваших темах вижу такое высказывание, но ни разу ни видел вариантов

Это сообщение отредактировал(а) krundetz - 27.1.2012, 15:55


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
$дмитрий
Дата 27.1.2012, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 1
Всего: 45



skyboy, совершенно не слабо, думаешь прирост скорости существенней будет?
PM MAIL   Вверх
skyboy
Дата 27.1.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата($дмитрий @  27.1.2012,  15:29 Найти цитируемый пост)
думаешь прирост скорости существенней будет? 

не в этом случае. оптимизатор "LIKE 'Y%'" преобразует в эквивалент с подстрокой.
но зачем предлагать использование LIKE/REGEXP в этом случае?
чтоб следующим вопросом было "а почему у меня на 1000 строк тормозит LIKE a%b%?"?
PM MAIL   Вверх
$дмитрий
Дата 27.1.2012, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 1
Всего: 45



Тесты дают интересные результаты

10 000 строк. Где NAME - поле с случайным набор [a-Z0-9]{6}, CHAR - символ от A до Z
Код

SELECT SQL_NO_CACHE * FROM `test` WHERE `NAME` LIKE 'CHAR%' ~0.007 сек.
SELECT SQL_NO_CACHE * FROM `test` WHERE 'CHAR' = SUBSTR(NAME, 1, 1); ~0.008 сек.
SELECT SQL_NO_CACHE * FROM `test` WHERE `NAME` REGEXP '^CHAR' ~0.011 сек.

При 100, 1000 строк картина та же
PM MAIL   Вверх
Zloxa
Дата 27.1.2012, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(skyboy @  27.1.2012,  15:36 Найти цитируемый пост)
ребят, вы чего? а слабо использовать substr? а слабо... 

Цитата(skyboy @  27.1.2012,  17:27 Найти цитируемый пост)
зачем предлагать использование LIKE/REGEXP в этом случае?


Я поначалу думал ты прикалываешься. smile 

Вариант с лайк - единственный из предложенных, который допускает использование индекса. А потому он единственный - не извращенный.  smile 

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

Добавлено @ 23:54
Оракл, миллион случайных буквенных строк длинной 100 символов, с индексом
Код

set echo on
set timing on
select count(*) from  test where substr(val,1,2)= 'fo';
 
  COUNT(*)
----------
       386
 
Executed in 1.046 seconds
select count(*) from  test where regexp_like(val, '^fo');
 
  COUNT(*)
----------
       386
 
Executed in 10.234 seconds
select count(*) from  test where val like 'fo%';
 
  COUNT(*)
----------
       386
 
Executed in 0.625 seconds


Мася, афайк, тоже умеет использовать индекс для отбора по лайку, при условии захвата паттерна с начала строки.

Это сообщение отредактировал(а) Zloxa - 28.1.2012, 00:09


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 27.1.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Чота я сначала опубликовал результат, а потом его сам посмотрел и диву дался...
оказалось я индекс не построил.  smile 
Вот результат с индексом:
Код

set echo on
set timing on
select count(*) from  test where substr(val,1,2)= 'fo';
 
  COUNT(*)
----------
       386
 
Executed in 1.125 seconds
select count(*) from  test where regexp_like(val, '^fo');
 
  COUNT(*)
----------
       386
 
Executed in 10.125 seconds
select count(*) from  test where val like 'fo%';
 
  COUNT(*)
----------
       386
 
Executed in 0.063 seconds



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1336 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.