Заявка за символи на кирилица

dakata__92

Super Moderator
Здравейте колеги.
Код:
SELECT
	COUNT( * ) AS `count`,
	LENGTH( text ) AS length,
	text 
FROM
	table
WHERE
	text REGEXP "[а-яА-Я]" 
GROUP BY
	text
ORDER BY
	COUNT( * ) DESC
Тази заявка ми връща всички текстове съдържащи в себе си символи на кирилица. Има ли вариант да засичам броят на символите на кирилица за да визуализирам тези съобщения, които съдържат в себе си по-малко от 50% символи. Тоест искам да избегна визуализацията на текстове написани изцяло на кирилица, а да показвам смесените текстове, който в себе си съдъжат повече латински символи и по-малко кирилица.

Пример:
„Iskam davizualiziram този tekst“ но не и да „ визуализирам този tekst“.
 
Странно, май не е толкова лесно да отсяваш с regex в sql. https://stackoverflow.com/questions/21378193/regex-pattern-inside-sql-replace-function

Иначе да преброиш кирилицата - https://stackoverflow.com/questions/1860457/how-to-count-instances-of-character-in-sql-column, някакво грубо "решение" би било да изброиш ръчно (генерирайки заявката с php примерно) наш'та азбука:

Код:
SELECT `col` FROM table
WHERE 2 * LEN( REPLACE( (… REPLACE(`col`, 'а', '') …), 'я', '')) > LEN(`col`)
 
anonimen каза:
Странно, май не е толкова лесно да отсяваш с regex в sql. https://stackoverflow.com/questions/21378193/regex-pattern-inside-sql-replace-function

Иначе да преброиш кирилицата - https://stackoverflow.com/questions/1860457/how-to-count-instances-of-character-in-sql-column, някакво грубо "решение" би било да изброиш ръчно (генерирайки заявката с php примерно) наш'та азбука:

Код:
SELECT `col` FROM table
WHERE 2 * LEN( REPLACE( (… REPLACE(`col`, 'а', '') …), 'я', '')) > LEN(`col`)
REGEXP "[а-яА-Я]" хваща и текстове съдържащи „№“ или подобни символи, което ме устройва. Вижда ми се прекалено голяма хамалогия да се върти всяка буква от азбуката по отделно. Нямам наличен REGEX_REPLACE() иначе бих тествал с него.
 
dakata__92 каза:
anonimen каза:
Странно, май не е толкова лесно да отсяваш с regex в sql. https://stackoverflow.com/questions/21378193/regex-pattern-inside-sql-replace-function

Иначе да преброиш кирилицата - https://stackoverflow.com/questions/1860457/how-to-count-instances-of-character-in-sql-column, някакво грубо "решение" би било да изброиш ръчно (генерирайки заявката с php примерно) наш'та азбука:

Код:
SELECT `col` FROM table
WHERE 2 * LEN( REPLACE( (… REPLACE(`col`, 'а', '') …), 'я', '')) > LEN(`col`)
REGEXP "[а-яА-Я]" хваща и текстове съдържащи „№“ или подобни символи, което ме устройва. Вижда ми се прекалено голяма хамалогия да се върти всяка буква от азбуката по отделно. Нямам наличен REGEX_REPLACE() иначе бих тествал с него.

Точно, някакъв вид regex_replace и аз не мога да открия.
Нямаш ли вариант да изтеглиш всички резултати и да направиш това филтриране през php?
 
anonimen каза:
dakata__92 каза:
anonimen каза:
Странно, май не е толкова лесно да отсяваш с regex в sql. https://stackoverflow.com/questions/21378193/regex-pattern-inside-sql-replace-function

Иначе да преброиш кирилицата - https://stackoverflow.com/questions/1860457/how-to-count-instances-of-character-in-sql-column, някакво грубо "решение" би било да изброиш ръчно (генерирайки заявката с php примерно) наш'та азбука:

Код:
SELECT `col` FROM table
WHERE 2 * LEN( REPLACE( (… REPLACE(`col`, 'а', '') …), 'я', '')) > LEN(`col`)
REGEXP "[а-яА-Я]" хваща и текстове съдържащи „№“ или подобни символи, което ме устройва. Вижда ми се прекалено голяма хамалогия да се върти всяка буква от азбуката по отделно. Нямам наличен REGEX_REPLACE() иначе бих тествал с него.

Точно, някакъв вид regex_replace и аз не мога да открия.
Нямаш ли вариант да изтеглиш всички резултати и да направиш това филтриране през php?
Имам го, като вариант, но ще трябва да въртя поне два излишни цикъла.
 
За работа ли ти трябва или ей така за фъна?

Предвид очаквания резултат, 2 цикъла ще са по-бързи от всичките магии, които ще трябва да се направят, за да сътвориш заявката. А ако говорим и в таблица с много данни, това ще е овъркил.
Ако не правиш това просто, защото ти се разписват по-комплексни заявки със SQL, с 2 ръце съм да вършиш тази гимнастика с PHP.
 
Между другото за каква база данни говорим? MySQL 5.7 или MariaDB? Защото MariaDB от 10.0.5 си имат REGEXP_REPLACE().
 
И върти ги и запиши символите кирилица в нова колона като процент. Съответно при всеки ъпдейт/инсърт правиш същото. После е лесно.
 
uphero каза:
И върти ги и запиши символите кирилица в нова колона като процент. Съответно при всеки ъпдейт/инсърт правиш същото. После е лесно.
Наистина точно това е решението. Преброяваш ги при запис, а не всеки път при четене. Конвертираш първоначално таблицата, за да заложиш това ново поле. Регулярните изрази не могат да броят, така че това което искаш няма как да стане по някакъв автоматизиран начин.
 
Revelation каза:
За работа ли ти трябва или ей така за фъна?
Предвид очаквания резултат, 2 цикъла ще са по-бързи от всичките магии, които ще трябва да се направят, за да сътвориш заявката. А ако говорим и в таблица с много данни, това ще е овъркил.
Ако не правиш това просто, защото ти се разписват по-комплексни заявки със SQL, с 2 ръце съм да вършиш тази гимнастика с PHP.

Здравей. Да за работа ми е необходимо. На мен като цяло просто ми трябваше да заместя utf-8 символите с нищо и на практика да сравня оригиналната дължина на стрина със заменената. Май накрая ще трябва да се примиря и да го направя с PHP.

Revelation каза:
Между другото за каква база данни говорим? MySQL 5.7 или MariaDB? Защото MariaDB от 10.0.5 си имат REGEXP_REPLACE().

Извинявам се, че не съм уточнил, MySQL ползвам.

uphero каза:
И върти ги и запиши символите кирилица в нова колона като процент. Съответно при всеки ъпдейт/инсърт правиш същото. После е лесно.

Текстовете от време на време могат да се променят от потребителите, така че не ми е вариант да записвам стойността, а трябва да проверявам динамично. Естествено ще кеширам заявките, така че ще постигна бързодействие.

xyz1 каза:
uphero каза:
И върти ги и запиши символите кирилица в нова колона като процент. Съответно при всеки ъпдейт/инсърт правиш същото. После е лесно.
Наистина точно това е решението. Преброяваш ги при запис, а не всеки път при четене. Конвертираш първоначално таблицата, за да заложиш това ново поле. Регулярните изрази не могат да броят, така че това което искаш няма как да стане по някакъв автоматизиран начин.

Мен ме устройваше да мога да заменя символите с празен стринг, Така щях да изчисля разликата между дължината на реалния и променения текст.
 

Горе