I've a mysql table with a lot of folderNames and Directory names, for Example "C:\xx\xyz" or "C:\xx" or "C:\xx\xyz\abc".
Now I have to sort this Query by the count of this Backslashes. I need the Dir C:\xx as first, because I have to create this Directory before I can create a sub-dir in it.
How can I do this?
Something like this:
SELECT dirName
FROM yourTable
ORDER BY (LENGTH(dirName) - LENGTH(REPLACE(dirName, '\\', '')))
SQLFillde demo
ORDER BY LENGTH(folder)-LENGTH(REPLACE(folder,'\\',''))
It's often not necessary to create directories in order:
C:\>mkdir test
C:\>dir test
El volumen de la unidad C es Sistema
El número de serie del volumen es: 6882-2759
Directorio de C:\test
15/02/2013 12:01 <DIR> .
15/02/2013 12:01 <DIR> ..
0 archivos 0 bytes
2 dirs 115.358.355.456 bytes libres
C:\>mkdir test\foo\bar\one\two\three
C:\>dir test
El volumen de la unidad C es Sistema
El número de serie del volumen es: 6882-2759
Directorio de C:\test
15/02/2013 12:02 <DIR> .
15/02/2013 12:02 <DIR> ..
15/02/2013 12:02 <DIR> foo
0 archivos 0 bytes
3 dirs 115.358.355.456 bytes libres
C:\>
Related
im new to SQL in general, so im learning, i had many troubles before, so the code its not clean enough.
here is my trigger, its a update from all the products, generating a table in html,If you can think of another way to do it, I would love to know it to learn, initially I tried to make a cursor inside another cursor but it gave me many errors,some1 recommended to do a trigger before update to go through all the products and only use a cursor to do the checks that I need, thanks for everything <3
(Srry for my english too, hope you can understand me)
BEGIN
declare contentCursor text;
declare tableContent text default "<table width=""250"" cellpadding=""0"" cellspacing=""0""><tbody>";
declare alegenos varchar(30);
declare contieneAlergenos int;
declare trazasCerca int;
declare siCerca text default "";
DECLARE ch_done INT DEFAULT 0;
DECLARE alegenosCursor cursor for select Nombre from ps_ets_ept_alegenos;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ch_done = 1;
-- Guardo el contenido de la descr (En los primeros 150 productos era una tabla que convertir en otra)
-- SELECT contentCursor;
-- Generar tabla correctamente apartir de la tabla equivocaeda
-- Recorro una tabla con la lista de alergenos
BLOCK2: begin
open alegenosCursor;
bucleAlergenos:LOOP fetch alegenosCursor into alegenos;
IF(ch_done = 1) THEN
-- handle the No data error!
set ch_done=1;
END IF;
-- Veo si el alergeno actual lo tiene la tabla incorrecta
SELECT LOCATE(alegenos, old.content) into contieneAlergenos;
if contieneAlergenos>0 then
-- En el caso de que este busco si tiene un Trazas o un Si, si me coloco al final de la palabra del alergeno, sumandole los 44 Es donde empieza el Si o el Trazas, el siete es por el largo de trazas + 1 espacio
SELECT LOCATE("Trazas",SUBSTR(old.content,contieneAlergenos+length(alegenos)+44,7)) INTO trazasCerca;
-- Si trazasCerca es mayor que 0 el contenido de ese alergeno son Trazas, asi que se lo asigno a la variable siCerca, en caso de que sea 0 le asigno un Si
if trazasCerca>0 then SET siCerca="Trazas";
else SET siCerca="Si";
end if;
-- Concadeno el Si o el Trazas
SELECT CONCAT(tableContent,"<tr><td width=""60%"" align=""left""><strong>", alegenos, "</strong></td><td width=""40%"" align=""left""> ", siCerca, "</td></tr>") INTO tableContent; -- devuelve Alergeno y una string si tiene Trazas o si, hace falta un locate de Si o Trazas y generar la tabla
-- En caso de no encontrar el alergeno, le meto el campo de la tabla con el alergeno y un no
else SELECT CONCAT(tableContent,"<tr><td width=""60%"" align=""left""><strong>", alegenos, "</strong></td><td width=""40%"" align=""left"">No</td></tr>")INTO tableContent ; -- tienes el alergeno que no está en la tabla, aqui generare la td de el alergeno con un No
end if;
-- reinicio las variables que suelo concadenar
SET siCerca="";
SET trazasCerca=0;
SET contieneAlergenos=0;
-- select tableContent as Dentro;
END LOOP bucleAlergenos;
select CONCAT(tableContent,"</tbody></table>")INTO tableContent;
insert into pruebaTablas VALUES (tableContent);
set tableContent="";
close alegenosCursor;
END BLOCK2;
END
I am trying to get the words to appear most often in differents articles. However, I am confronted with the problem of the plural and singular forms of a word.
Table : articles
Id articles
1 <b>Augmentation du nombre de noyades : des pistes d’explications</b><u><br> </u><br/>Paris, le jeudi 12 juin 2019 - Les enquêtes Noyades menées depuis 2002 par Santé publique France ont pour objectifs de recenser l’ensemble des noyades (accidentelles ou non, suivies de décès ou non) et de décrire les caractéristiques des victimes et des circonstances de survenue de ces incidents à des fins de prévention. <br/>Cette enquête est réalisée par questionnaire auprès des services de secours du 1er juin au 30 septembre en France métropolitaine et en Outre-mer. <br/>La dernière enquête a permis de recenser, en 2018, 1 960 noyades dont 30% (597/1 960) ont été suivies de décès. Parmi l’ensemble de ces noyades, 84% (1 649/1 960) étaient d’origine accidentelle, 8% (149/1 960) intentionnelles (tentatives de suicide, suicide ou agression) et 8% (162/1 960) étaient d’origine inconnue. <br/>Les investigateurs se sont plus particulièrement penchés sur les 1 649 noyades accidentelles (dont 25% à l’origine de décès) ces événements ayant augmenté de 30% par rapport à l’enquête de 2015 (1 266) sans qu’on assiste pour autant à une hausse des décès (entre 400 à 500 en moyenne chaque année). <br/><b>La canicule sur le banc des accusés</b><br/>Un premier facteur d’explication de cette forte augmentation des noyades « <i>est le contexte de fortes chaleurs durant la période de l’enquête</i> » soulignent les auteurs de ces travaux publiés dans le Bulletin épidémiologique hebdomadaire. Une étude canadienne a ainsi déjà montré que, sur la période 1999-2009, les températures excédant 30 °C étaient associées à une augmentation de 69% du risque de noyade en extérieur. Or, l’été 2018 a été classé par Météo-France comme le deuxième été le plus chaud depuis 1900. <br/><b>La noyade sèche : un concept faux qui fausse les chiffres</b><br/>Autre facteur explicatif pour les auteurs, la médiatisation depuis quelques années, et particulièrement depuis 2017, du concept de noyade «<i> sèche </i>» (noyade qui interviendrait plusieurs heures, voire plusieurs jours après une activité de baignade) qui ne repose sur aucune réalité scientifique mais qui a pu entraîner une sollicitation plus élevée des services de secours par des parents inquiets à la suite d’un début de noyade d’un enfant. <br/>Autre hypothèse, chez les moins de 6 ans, près des trois-quarts (73%) des noyades accidentelles ont eu lieu en piscine privée familiale. Or, la multiplication de piscines privées hors sol, dépourvues de système de sécurité pourrait être une explication à l’augmentation constatée. <br/><b>Un biais statistique ? </b><br/>Les auteurs soulignent en outre « <i>nous ne pouvons exclure que l’utilisation des données du réseau Oscour</i>® <i>pour la première fois lors de l’enquête 2018 ait pu entraîner une meilleure exhaustivité du recensement des noyades</i> ». Néanmoins, ils tempèrent « <i>Cependant, ceci ne pourrait expliquer qu’une faible partie de l’augmentation du nombre de noyades car lorsque la noyade n’était rapportée que par l’hôpital identifié par les données du réseau Oscour®, elle n’a pas été prise en compte car nous avons considéré que la victime n’avait pas été prise en charge par un service de secours organisé mais avait vraisemblablement été emmenée par un proche</i> ». <br/><b>Xavier Bataille</b></p>
I use this SQL query:
select DISTINCT val, cnt as result from(
select REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE((substring_index(substring_index(t.articles, ' ', n.n), ' ', -1)),',',''),'.',''),'(',''),')',''),'!',''),'?',''),'%',''), '<b>', ' '), '</p>', ' '), '</b>', ' '), '<br/>', ''), '<br>', ''), ',', ' '), '<i>', ' '), '</i>', ' '), '.', ' '), '<u>', ' '), '</u>', ' '), '’', '\''), '*', ' '), '"', ' ') val,count(*) as cnt
from articles t cross join(
select a.n + b.n * 10 + c.n * 100 + 1 as n
from (select 0 as n union all select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9
) a cross join
(select 0 as n union all select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9
) b cross join
(select 0 as n union all select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9
) c
) n
where n.n <= 1 + (length(t.articles) - length(replace(t.articles, ' ', '')))
AND (substring_index(substring_index(t.articles, ' ', n.n), ' ', -1)) NOT REGEXP '^[0-9]+$'
AND (substring_index(substring_index(t.articles, ' ', n.n), ' ', -1)) NOT REGEXP '>[^<]'
AND (substring_index(substring_index(t.articles, ' ', n.n), ' ', -1)) > ''
AND (substring_index(substring_index(t.articles, ' ', n.n), ' ', -1)) NOT REGEXP '[0-9]'
AND CHAR_LENGTH((substring_index(substring_index(t.articles, ' ', n.n), ' ', -1))) > 2
group by val
order by cnt desc
) as x
ORDER BY `result` DESC
SQL DEMO
What I get :
val result
des 15
noyades 10
...
noyade 6
...
What I want :
val result
noyade 16
des 15
...
So my question is: how can I accumulate the plural and singular forms of a word by ignoring the final 's' ?
I would like to replace the words ending with an "s" only if the same word without the final "s" exists
Let's suppose you instead just for the purposes of clarity, extracted all the words into a separate table (it could be a temporary table) called results with a single column named word. I would recommend having an index on column word. Then the following SQL would work:
select word, count(*) from (
select if (word in (
/* all words such as 'noyades' such that 'noyade' also exists */
select distinct sq.word from (
select word, REGEXP_REPLACE(word, '(.*)s', '$1') as edited_word from results
) sq
join results on sq.edited_word = results.word
where sq.word <> edited_word
), REGEXP_REPLACE(word, '(.*)s', '$1'), word) as word from results
) sq
group by word
order by count(*) desc
;
See the following DB-Fiddle
I've made a Batch script that does a query to a MYSQL DB then send an email, The problem I have is the query result don't show the name of the column.
#Definimos de correo
# ===================
export SUBJECT="Mediciones_Cumplimiento_de_Calidad-$FECHA"
export SERVER=Conda
# Definimos las variables de ubicación delos archivos utilizados por este script
# ===============================================================================
export DIR=/opt/iway/scripts/envio_mediciones
export LOG_FILE=${DIR}/envio_mediciones.log
export CONSULTA_MEDICIONES=${DIR}/mediciones_conda.sql
export MAIL_FILE=${DIR}/mediciones.mail
export SALIDA_MEDICIONES=${DIR}/Mediciones_Cumplimiento_de_Calidad-$FECHA.csv
export TEMP_FILE=${DIR}/temporal
export MAX_LOG_FILE_SIZE=5000
#Definido el nombre del ZIP:
SALIDA_ZIP="Mediciones_Cumplimiento_de_Calidad-${FECHA}.zip"
# Limpiamos el archivo que contiene el cuerpo del mail y le ponemos un encabezado
# ===============================================================================
${ECHO} subject: ${SUBJECT} > ${MAIL_FILE}
${ECHO} ${SUBJECT} >> ${MAIL_FILE}
${ECHO} "===================================" >> ${MAIL_FILE}
${ECHO} >> ${MAIL_FILE}
# Ejecutamos las Query's
# ======================
########################################################################################################
${MYSQL} < ${CONSULTA_MEDICIONES} > ${SALIDA_MEDICIONES}
${ZIP} ${SALIDA_ZIP} -j ${SALIDA_MEDICIONES}
${UUENCODE} ${SALIDA_ZIP} ${SALIDA_ZIP} >> ${MAIL_FILE}
${CAT} ${MAIL_FILE} |${SENDMAIL} -F ${REMITENTE} ${DESTINATARIOS}
This is the mysql query:
SELECT
CONCAT(HO.codigosonda,',') AS 'SONDA',
CONCAT(HO.host ,',') AS 'ID AGENTE',
CONCAT(CONCAT(HD.country, HD.state),',') AS 'UBICACIÓN',
CONCAT(P.planname,',') AS 'PLAN DE SERVICIO',
CONCAT(FROM_UNIXTIME(H.`clock`),',') AS 'FECHA DE MEDICIÓN',
CONCAT(I.`descriptionLong`,',') AS 'KPI',
CONCAT(ROUND(H.`value` / 1024 / 1024, 0),',') AS 'MEDICION( Mbps )'
FROM
`bm_history` H
INNER JOIN
`bm_items` I ON H.`id_item` = I.`id_item`
INNER JOIN
`bm_host` HO ON HO.`id_host` = H.`id_host`
INNER JOIN
`bm_plan` P ON P.id_plan = HO.id_plan
LEFT JOIN
`zold_host_features` HD ON HD.`id_host` = H.`id_host`
WHERE
(H.`clock` BETWEEN UNIX_TIMESTAMP(CONCAT(CURDATE() - INTERVAL 1 DAY, ' 00:00:00')) AND UNIX_TIMESTAMP(CONCAT(CURDATE() - INTERVAL 1 DAY, ' 23:59:59')))
AND HO.`groupid` = 6
AND H.`id_item` IN (3867 , 3855)
ORDER BY `clock` DESC
The result is not giving me the Column names just the data how can I add that information?
I have a table (incident) with a column (update_Action) that contains information. Among this information the names are enclosed in parenthesis.
06/01/15 09:49:17 Tunisia (Hamed.Ghabi):
05/01/15 13:14:11 Tunisia (sabri.zayet):
reset des TREs 05/01/15 09:38:50 Tunisia (Hamed.Ghabi):
Pb persiste. Cdt,Hamed 02/01/15 14:37:45 Tunisia (khaled.rajhi):
Restart cell Cdt, Khaled
Question:
my goal is to extract these names is to store them in another column (intervenants) in the same table.
update incident set intervenants=
(substring(Update_Action,locate('(',Update_Action),locate(')',Update_Action)))
where Status='Closed'
But I got the following result: (Hamed.Ghabi): 05/01/15 13:14:11 Tunisi, instead of: Hamed.Ghabi,Sabri.Zayet,Khaled.Rajhi.
picture of the table:
!06/01/15 09:49:17 Tunisia (Hamed.Ghabi):
05/01/15 13:14:11 Tunisia (sabri.zayet):
reset des TREs
05/01/15 09:38:50 Tunisia (Hamed.Ghabi):
Pb persiste.
Cdt,Hamed
02/01/15 14:37:45 Tunisia (khaled.rajhi):
Restart cell
Cdt, Khaled
05/01/15 09:42:40 Tunisia (Hamed.Ghabi):
02/01/15 14:38:00 Tunisia (khaled.rajhi):
Restart cell
Cdt, Khaled
26/01/15 09:14:56 Tunisia (Hamed.Ghabi):
23/01/15 11:30:46 Tunisia (walid.hadjtaieb):
prière de vérifier l’état suite intervention maintenance.
il parait que le problème est résolu (en attache)
13/01/15 11:43:19 Tunisia (nabil.zarrad):
Merci d'attacher le résultat des mesures PIM sur SM9 (pour garder l'historique des actions).
12/01/15 16:35:10 Tunisia (fethi.nasri):
Résultat mesure PIM envoyé.
07/01/15 17:53:49 Tunisia (walid.hadjtaieb):
prière de planifier une mesure PIM sur S2
06/01/15 09:46:34 Tunisia (
You could create a function to extract the text in the parenthesis:
EDIT: removed an unnecessary variable + general cleanup.
DELIMITER $$
CREATE FUNCTION `extractWordInParenthesis`(strIn varchar(500))
RETURNS varchar(500)
BEGIN
declare textString varchar(500) default strIn;
declare extractedString varchar(500) default '';
declare newOccurence varchar(500) default '';
while length(textString) <> length(replace(textString,')',''))
do
set newOccurence = substr(textString,
locate('(', textString)+1,
locate(')', textString)-locate('(', textString)-1);
-- check if the specific occurence have already been found
if length(extractedString) = length(replace(extractedString,newOccurence,''))
then
set extractedString =
concat(extractedString, ',', newOccurence);
end if;
set textString = substr(textString,locate(')', textString)+1);
end while;
RETURN substr(extractedString,2);
END$$
DELIMITER ;
This would be called like:
select extractWordInParenthesis(Update_Action) from incident
where Status = 'Closed';
And the update:
update incident set intervenants = extractWordInParenthesis(Update_Action)
where Status = 'Closed';
I have the following query :
SELECT
x.id,x.title
FROM `x`
WHERE `x`.status = 'validated'
ORDER BY `x`.title ASC
Results :
3042 Cinéastes en herbe Télé-Québec
1681 Danse contemporaine
2725 Dessins, peinture et illustrations.
2448 Les petits mots de Paolo
641 Ma tente à lire et les Mosaïques dans la rue
3215 Performance & Visites commentées
2186 Se partager l’espace : Yann Pocreau
2364 Souper communautaire
1223 100 ans
199 100% couleurs
2794 125 ans de tourisme à Laval
2306 À court de souffle!
1517 Abracadabra Sonia
2477 Atelier ouvert
335 Au bout du fil
2362 Au coeur de notre mémoire
2489 Bientôt 100 ans!
2275 Café historique
1838 Rencontre avec
Am i missing something ? Why the title is not ordered correctly ?
For info :
Collation : utf8_general_ci
Character set : utf-8
Solution : a hidden space was in the results --> used the trim function
I would check the first few rows to see if there is a hidden character at the front of the title.
SELECT
ASCII(SUBSTRING(x.title, 1, 1))
FROM
x
WHERE
x.id IN (3042, 1681)
Maybe you are not using the collation you want to. Depending on the collation of your database, strings get ordered differently.