Есть ли оператор, позволяющий сделать такую выборку?

12
P
На сайте с 06.01.2009
Offline
592
493

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

В поле таблицы БД такие варианты данных


1. [10*70, 30*20, 100*40]
2. [30*10]
3. [10,5*40]
4. [40*10,5]
5. [60*60, 10,5*60]
6. [25*25, 60*10,5]
7. [20*20, 10*30]
8. [110*100, 210,3*210,3]

Нужно отобрать все что содержит размер 10 - подходит 1,2,3,4,5,6,7. Не подходит - 8

1. Есть ли оператор, позволяющий взять вариант №1 - т.е. указать, что поле начинается с 10*

 $result = mysql_query("SELECT id FROM table WHERE pole LIKE '10*%'"); 

не совсем то, так как строка 8 тоже тогда берется.

2. Есть ли оператор, позволяющий взять вариант №2 - т.е. указать, что поле кончается на *10

 $result = mysql_query("SELECT id FROM table WHERE pole LIKE '%*10'"); 

не совсем то, так как строка 8 тоже тогда берется.

ps по остальным строкам как проверить, понятно. вопрос именно по этой.

Спасибо

freezebreeze
На сайте с 31.10.2013
Offline
9
#1

используйте RLIKE вместо LIKE.

Регулярку сами составите?

Верить никому нельзя. Мне — можно.
P
На сайте с 06.01.2009
Offline
592
#2
freezebreeze:
используйте RLIKE вместо LIKE.
Регулярку сами составите?

Регулярки не умею. Да у меня тут бред получается.

Думаю, может брать все строки, а потом разбирать средствами php и проверять размеры.

А то вот что получается


$result = mysql_query("SELECT id FROM table WHERE razmery LIKE '10*%' OR razmery LIKE '%*10'
OR razmery LIKE '10,%' OR razmery LIKE '%*10,%' OR razmery LIKE ', 10*%' OR razmery LIKE ', 10,*%'");

LIKE по порядку

1-й 10* в начале строки

2-й *10 в конце строки

3-й 10, в начале строки

4-й содержит *10,

5-й в строке есть , 10*

6-й в строке есть , 10,

Средствами php так думаю. Как считаете - может так лучше?

Берем всю строку - в начало добавляем пробел, в конец запятую.

Дальше смотрим содержит ли строка [ 10*] [ 10,] [*10,]

Обработать нужно примерно 5000 строк.

3-й вариант. поправить записи в БД, т.е. сделать в БД в начало добавляем пробел, в конец запятую.

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#3

Можно я скажу мнение?

Структуру БД меняйте. То что у вас, это уныние. Структура БД не справляется со своей задачей. Разбивайте эти размеры на каждый столбец и потом поиск будет точный, быстрый и не напрягающий БД.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
freezebreeze
На сайте с 31.10.2013
Offline
9
#4

Довольно сложная регулярка получается. Неповоротливая в дальнейшем использовании.

Лучше структуру поменять.

P
На сайте с 06.01.2009
Offline
592
#5
LEOnidUKG:
Можно я скажу мнение?

Структуру БД меняйте. То что у вас, это уныние. Структура БД не справляется со своей задачей. Разбивайте эти размеры на каждый столбец и потом поиск будет точный, быстрый и не напрягающий БД.

Полностью согласен.

Т.е. нужно сделать так?

Таблица БД содержит 10 полей для вариантов размеров, в которых будут перечисленны размеры (т.е. одно поле раскидать в 1-10 ячеек, смортя сколько вариантов размеров для данной коллекции). Да?

Потом при поиске делать отбор типа такого

WHERE pole1='10*10' OR pole2='10*10' OR pole3='10*10' ...OR pole10='10*10'

так будет проще базе?

---------- Добавлено 08.11.2013 в 16:03 ----------

freezebreeze:
Довольно сложная регулярка получается. Неповоротливая в дальнейшем использовании.
Лучше структуру поменять.

Согласен, поэтому на текущий момент сделал так.

1. вынимаю все id из таблицы и их варианты размеров

2. строку с размерами редактирую средствами php

3. строку с размерами проверяю на присутствие "10*", "*10," и т.д.

4. если присутствует - заношу id в новый массив

5. вынимаю из бд нужные данные по отобранным id

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#6
так будет проще базе?

Да. Но есть ещё один вариант. Это создать отдельную таблицу, в которой будет

ID|ID tovar|razmer

и уже в ней закинуть индексы и делать поиск по ней. Удобство, что можно к 1 товару сразу сделать много записей, не плодя столбцы. Вижу это лучше в вашем случаи, если у вас по 10 размеров на 1 товар.

P
На сайте с 06.01.2009
Offline
592
#7
LEOnidUKG:
Да. Но есть ещё один вариант. Это создать отдельную таблицу, в которой будет
ID|ID tovar|razmer

и уже в ней закинуть индексы и делать поиск по ней. Удобство, что можно к 1 товару сразу сделать много записей, не плодя столбцы. Вижу это лучше в вашем случаи, если у вас по 10 размеров на 1 товар.

Леонид, поясните, пожалуйста.

ID|ID tovar|razmer

ID -понятно, просто id поля новой таблицы

ID tovar - id из таблицы с товарами

razmer - не понимаю, смысла же нет сюда писать [10*10, 20*20, 25*40, 40*60, 60*60 и т.д.]

---------- Добавлено 08.11.2013 в 16:26 ----------

LEOnidUKG:
Удобство, что можно к 1 товару сразу сделать много записей, не плодя столбцы. Вижу это лучше в вашем случаи, если у вас по 10 размеров на 1 товар.

А, понял, так ?


1|1200|10*10
2|1200|5*5
3|1200|20*20
4|1201|7*7
5|1201|8*8

Это круто, но не наглядно. Думаю как же поступить. Вообще вариант нравится, но опять же - удобно ли будет смотреть на неё. Спасибо

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#8
postavkin:
Леонид, поясните, пожалуйста.
ID|ID tovar|razmer
ID -понятно, просто id поля новой таблицы
ID tovar - id из таблицы с товарами
razmer - не понимаю, смысла же нет сюда писать [10*10, 20*20, 25*40, 40*60, 60*60 и т.д.]

---------- Добавлено 08.11.2013 в 16:26 ----------



А, понял, так ?

Это круто, но не наглядно. Думаю как же поступить. Вообще вариант нравится, но опять же - удобно ли будет смотреть на неё. Спасибо

На неё не надо смотреть. :)

Делаете поиск по этой таблице, а потом выводите по ID tovar из другой таблицы описание товара, который подошёл по поиску.

P
На сайте с 06.01.2009
Offline
592
#9

Есть ещё проблема, видимо решение лучшее такое.

Учитывая, что Вы подсказали Леонид.

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

ID|ID tovar|razmer1|razmer2

где razmer1 - это по одной стороне, razmer2 - по второй.

Но опять же, как проводить отбор, если размер содержит запятую?

Как выбрать товары, где одна из сторон = 20

1|200|20|20 // т.е. тут размер товара 20*20

2|200|30|30 // тут 30*30

3|200|60|20,2 // тут 60*20,2

4|205|20,5|30 // тут 20,5*30

5|205|30|30

6|205|60|60

7|207|20,1|40,2

8|207|40,2|40,2

Леонид, подскажите, пожалуйста.

1. хорошее решение сделать по столбцу с размером для каждой стороны?

2. как проводить отбор, если запятая в размере, получается что опять лайкать LIKE '%%' нужно, что не есть хорошо как я понимаю.

TF-Studio
На сайте с 17.08.2010
Offline
334
#10

Ну так храните не сантиметры, какие проблемы? (*10)

Менять архитектуру БД - самое верное направление.

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий