Страница 1 из 1

Помогите сформировать SQL-запрос

Добавлено: 2009-07-03 10:01:29
kozak
Привет всем кто вместо того чтобы плавиться на море под солнцем, впитывает излучение он монитора! :bad:

Вот мой трабл:

Есть таблица my_tab с колонкой my_col

Код: Выделить всё

+--my_col--------+
| AA.02.6.6.1      |
| AA.02.6.6.1.1    |
| AA.02.6.6.1.2    |
| AA.02.6.6.1.3    |
| AA.02.6.6.1.4    |
| AA.02.6.6.1.5    |
| AA.02.6.6.1.6    |
| AA.02.6.6.1.7    |
| AA.02.6.6.1.8    |
| AA.02.6.6.1.9    |
| AA.02.6.6.1.10   | - здесь начинаются проблемы с [[:digit:]] (максимум число 9)
| AA.02.6.6.2      |
| AA.02.6.6.2.1    |
| AA.02.6.6.2.2    |
| AA.02.6.6.2.3    |
+----------------+
Как правильно сформулировать запрос чтобы выбрать последнюю запись из колонки my_col по маске AA.02.6.6.1.PATT

где PATT - последняя запись в таблице

т.е. чтоб при запросе по маске AA.02.6.6.1 вывело AA.02.6.6.1.10

Вот моя безрезультатная попытка:

Код: Выделить всё

$query = "SELECT my_col FROM my_db.my_tab
			WHERE my_col REGEXP '^AA.02.6.6.1.[[:digit:]]+$'
			ORDER BY my_col DESC LIMIT 1";
Выдает максимальное число PATT = "9"

:st:

Re: Помогите сформировать SQL-запрос

Добавлено: 2009-07-03 11:14:06
hizel
для начала просто точка(.) рассматривается как любой символ, я бы ее забрейкил палочкой(\)

Re: Помогите сформировать SQL-запрос

Добавлено: 2009-07-03 13:05:10
kozak
Нет. То же самое. Максимум выбирает AA.02.6.6.1.9...

Re: Помогите сформировать SQL-запрос

Добавлено: 2009-07-03 15:02:27
E-Wind
Наманьячил ))

Код: Выделить всё

SELECT CONVERT(SUBSTRING_INDEX( SUBSTRING_INDEX(my_col,'.',6), '.', -1),UNSIGNED) as my_idx, id, my_col FROM `tbl` WHERE (my_col LIKE 'AA.02.6.6.1.%') order by my_idx desc LIMIT 1
Результат

Код: Выделить всё

my_idx	id	my_col  
10		11	AA.02.6.6.1.10 
А теперь давайте упрощать )

Пока работаем со строкой - 9 > 10 )) от этого отталкиваемся...

"Дамп":

Код: Выделить всё

id	my_col  
1	AA.02.6.6.1 
2	AA.02.6.6.1.1 
3	AA.02.6.6.1.2 
4	AA.02.6.6.1.3 
5	AA.02.6.6.1.4 
6	AA.02.6.6.1.5 
7	AA.02.6.6.1.6 
8	AA.02.6.6.1.7 
9	AA.02.6.6.1.8 
10	AA.02.6.6.1.9 
11	AA.02.6.6.1.10 
12	AA.02.6.6.2 
13	AA.02.6.6.2.1 
14	AA.02.6.6.2.2 
15	AA.02.6.6.2.3 

Re: Помогите сформировать SQL-запрос

Добавлено: 2009-07-03 16:54:03
kozak
cat THNX > E-Wind :smile:

Но теперь при маске AA.02.6.6.1 работает на ура, но при маске AA.02.6.6 не выдает AA.02.6.6.2 а выдает тот же результат, что и для AA.02.6.6.1 = AA.02.6.6.1.10 :(

Re: Помогите сформировать SQL-запрос

Добавлено: 2009-07-03 17:02:40
kozak
Оп-оп-оп!!!

Получилось. Выбирал не ту колонку...
Вот лапух... :fool:

Спасибо за помощь!!!

Re: Помогите сформировать SQL-запрос

Добавлено: 2009-07-03 20:14:12
zg
E-Wind писал(а):Наманьячил ))
угу, я бы так сделал

Код: Выделить всё

mysql> select mask, replace(mask,'AA.02.6.6.1.','')+0 from test where mask LIKE "AA.02.6.6.1%";
+----------------+-----------------------------------+
| mask           | replace(mask,'AA.02.6.6.1.','')+0 |
+----------------+-----------------------------------+
| AA.02.6.6.1    |                                 0 |
| AA.02.6.6.1.1  |                                 1 |
| AA.02.6.6.1.2  |                                 2 |
| AA.02.6.6.1.3  |                                 3 |
| AA.02.6.6.1.4  |                                 4 |
| AA.02.6.6.1.5  |                                 5 |
| AA.02.6.6.1.6  |                                 6 |
| AA.02.6.6.1.7  |                                 7 |
| AA.02.6.6.1.8  |                                 8 |
| AA.02.6.6.1.9  |                                 9 |
| AA.02.6.6.1.10 |                                10 |
+----------------+-----------------------------------+
11 rows in set (0.00 sec)

mysql>
суть ясна? или пояснить :smile:

Re: Помогите сформировать SQL-запрос

Добавлено: 2009-07-05 13:31:25
kozak
Уже ясна. 5+ за оптимизацию. :smile:

Функция GROUP_CONCAT

Добавлено: 2011-04-05 21:27:38
kozak
Таблица все та-же...)

Код: Выделить всё

+--my_col----------+-my_name-
| AA.02.6.6.1      |   A
| AA.02.6.6.1.1    |   B
| AA.02.6.6.1.2    |   C
| AA.02.6.6.1.3    |   D
| AA.02.6.6.1.4    |   E
| AA.02.6.6.1.5    |   F
| AA.02.6.6.1.50   |   G
| AA.02.6.6.1.51   |   H
| AA.02.6.6.1.52   |   I
....
При выборке

Код: Выделить всё

SELECT GROUP_CONCAT(`my_name` ORDER BY `my_col` ASC SEPARATOR '+') FROM table WHERE 'AA.02.6.6.1.51' LIKE CONCAT(my_col,'%')
выдает не "H+A" а "H+F+A" т.к. строка "AA.02.6.6.1.5" тоже попадает под это условие.

Подскажите, как сгруппировать строки поочередно, групируя их по сумме "." (точек)?

Результатом, должна стать строка "H+A".

Спасибо!