Vous consultez les articles de la catégorie SQL
Oct
30

Trier dans un ordre spécifique avec MySql

Il arrive parfois que l’on ai besoin de trier les résultats d’une requête SQL dans un ordre précis, qui ne soit ni croissant, ni décroissant.

Pour cela, il faut utiliser la fonction FIND_IN_SET() dans le order by.

Exemple

SELECT nom
FROM chaine
ORDER BY FIND_IN_SET(idChaine, '17,12,1,9,8,5')

Attention cependant aux performances, c’est une fonction qui peut être gourmande selon la taille de la table.

Il est aussi possible d’utiliser la fonction FIELD, vous trouverez un bon exemple sur ce site :

https://oncletom.io/2007/mysql-tri-personnalises-aleatoires/

Nov
15

Limite de caractères de la fonction Group_concat Mysql

Author Appo    Category SQL     Tags , , , ,

Si vous utilisez la fonction Group_concat de mysql, il faut savoir que cette fonction a une limite de caractère par défaut (1024 pour mon cas). Ce qui est traître, c’est que mysql n’indique pas d’erreur et va tronquer le résultat retourné.

Pour contourner cette limite il suffit de lancer la requête suivante avant votre requête contenant le group_concat

SET [SESSION | GLOBAL] group_concat_max_len = nbre de caractères;

La valeur doit aussi certainement être modifiable dans un fichier de configuration de mysql.

Sep
18

MySQL : Comment effectuer un toggle sur un champ ?

Author Nico    Category SQL     Tags , , ,

Petite astuce rapide.

Mettons-nous en situation. Nous avons une table utilisateur avec un champ actif qui peut contenir les valeurs 1 ou 0 selon que l’utilisateur est actif ou pas.

Nous souhaitons, via une requête SQL, inverser l’état de ce champ sans faire de test en programmation. Voici comment faire.

Lire la suite

Fév
15

Gérer les schémas Postgresql dans Doctrine

Gérer les schemas Postgres avec Doctrine
Après avoir passé pas mal de temps à chercher (notamment en cherchant du coté des DSN de PDO), j’ai enfin trouver une solution simple pour prendre en compte les schémas (autre que public) dans Postgresql avec Doctrine.

Pour cela il vous suffit d’ajouter une ligne de code dans votre fichier où vous initialisez votre connexion

  $options = $this->getOptions();
  $conn = Doctrine_Manager::connection($options['dsn'], 'doctrine');
      	if (isset($options['schema'])) {
      		$conn->execute(sprintf('SET search_path TO %s;', $options['schema']));
      	}

Lire la suite

Fév
10

Fonction SQL COALESCE

Author Appo    Category SQL     Tags , ,

Fonction SQL COALESCE

Aujourd’hui j’ai découvert une fonction SQL suite à un besoin particulier. Cette fonction c’est COALESCE, elle permet de retourner le premier élément non-NULL de la liste.

Exemple :

SELECT COALESCE(NULL,1);

Cette requete renverra 1 car c’est la première valeur de la liste non NULL.

Lire la suite

Oct
14

Inscrire MySQL en tant que service sous windows

Author Nico    Category SQL     Tags , ,

Lors de l’installation manuelle de MySQL sous Windows (au moins dans MySQL 4), le service ne s’enregistre pas automatiquement.

Pour enregistrer le service, se positionner dans le répertoire bin de MySQL et entrer la commande :

mysqld --install

Enfin, démarrer le service MySQL et vérifier que le lancement du service est bien « automatique »: démarrer>exécuter>cmd puis services.msc

Référence : http://dev.mysql.com/doc/refman/5.0/fr/windows-start-service.html

Sep
22

Changer le nom de domaine d’un site WordPress

WordPress enregistre dans la base de données l’adresse du site.

Lorsqu’on souhaite changer d’adresse, il faut modifier les champs correspondant en exécutant les requêtes suivantes :

UPDATE wp_options SET option_value = REPLACE(option_value, 'http://www.ancien-site.com', 'http://www.nouveau-site.com') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = REPLACE(guid, 'http://www.ancien-site.com','http://www.nouveau-site.com');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.ancien-site.com', 'http://www.nouveau-site.com');

Important : penser à modifier le chemin d’upload dans l’administration du site : Réglages > Divers.

Référence : http://sugi.fr/changer-de-nom-de-domaine-sous-wordpress/

Août
12

Première lettre en majuscule (MySQL)

La fonction suivante (fonction MySQL) permet de passer en majuscule la première lettre de chaque mot de la chaîne passée en paramètre, tandis que les autres lettres sont passées en minuscules.

DELIMITER $$
 
DROP FUNCTION IF EXISTS `ucfirst` $$
CREATE DEFINER=`root`@`localhost` FUNCTION `ucfirst`(x text) RETURNS text CHARSET utf8
BEGIN
 
#Déclarations
DECLARE positionEspace, positionProchainEspace INT DEFAULT 1;
DECLARE chaineRetour TEXT DEFAULT '';
DECLARE leMot TEXT DEFAULT '';
 
#Si ON trouve un espace dans la chaîne
IF x REGEXP ' ' THEN
 
  #Pour chaque espace trouvé, ON met en majuscule l'initiale du premier mot
  WHILE LOCATE(' ', x, positionEspace) DO
    #Position du prochain espace (pour déterminer la fin du mot courant)
    SET positionProchainEspace = LOCATE(' ', x, positionEspace) + 1;
 
    #On récupère le mot séparé par les espaces
    SET leMot = SUBSTRING(x,positionEspace,positionProchainEspace - positionEspace);
    #On Passe l'initiale du mot en majuscule et le reste en minuscule
    SET leMot = CONCAT(UPPER(SUBSTRING(leMot,1,1)),LOWER(SUBSTRING(leMot,2)));
 
    #On concatène le mot dont l'initiale est en majuscule avec le reste de la chaine de retour déjà constituée
    SET chaineRetour = CONCAT(chaineRetour,leMot);
 
    #On met à jour la position de l'espace pour passer au mot suivant
    SET positionEspace = positionProchainEspace;
  END WHILE;
 
  #Il faut ajouter le dernier mot, qu'on n'a pas pu délimiter car il ne contenait pas d'espace à la fin
  SET leMot = SUBSTRING_INDEX(x, ' ',-1);
  SET leMot = CONCAT(UPPER(substring(leMot,1,1)),LOWER(substring(leMot,2)));
  SET chaineRetour = CONCAT(chaineRetour, leMot);
 
  return chaineRetour;
 
else  #Si pas d'espace dans la chaîne, ON renvoie la version simple de ucfirst
  RETURN concat( UPPER(SUBSTRING(x,1,1)),LOWER(SUBSTRING(x,2)));
END IF;
 
END $$
 
DELIMITER ;
Juil
9

MySQL : la fonction GROUP_CONCAT()

Author Nico    Category SQL     Tags , ,

La fonction GROUP_CONCAT() de MySQL permet de concaténer les résultats d’un groupe.

Par exemple, si on veut récupérer les ID des utilisateurs pour les mettre dans un tableau:
avec une requête classique :

SELECT ID FROM utilisateur;

On devra ensuite parcourir les résultats un par un pour les ajouter au tableau (avec mysql_fetch… en PHP)

avec GROUP_CONCAT() :

SELECT GROUP_CONCAT(CAST(ID AS CHAR)) FROM utilisateur;

Au lieu d’avoir autant de lignes de résultat que l’on a trouvé d’utilisateurs, on n’aura ici qu’une seule ligne de résultats. Les ID seront séparés par des virgules. On se passe ainsi d’une boucle, puisqu’on sait qu’on a un résultat unique. On peut ensuite éclater la chaîne pour en faire un tableau (fonction explode() en PHP).

Quelques remarques :

  • On remarque la présence de la fonction CAST(… AS CHAR) dans l’exemple ci-dessus. Comme le résultat de la requête est une chaîne (valeurs séparées par des virgules), les valeurs à grouper doivent être converties en CHAR. On doit donc utiliser CAST() dès lors qu’on ne groupe pas des valeurs de type chaîne.
  • ATTENTION : GROUP_CONCAT() tronque le nombre de résultats d’après la valeur d’une constante MySQL (group_concat_max_len, par défaut fixée à 1024 bits). Il convient d’augmenter cette valeur (globalement avec GLOBAL ou seulement pour la session avec SESSION) de la manière suivante :
    SET SESSION group_concat_max_len = 1000000

Pour la documentation officielle, voir le site de MySQL.

Cet article vous a-t-il été utile ? N’hésitez pas à laisser un commentaire ci dessous.

Juil
8

Optimiser vos requêtes d’insertion multiple

Author Appo    Category PHP, SQL     Tags

Admettons que vous voulez ajouter une liste d’utilisateurs.

Au lieu de faire une requête INSERT par utilisateur comme ceci

  foreach ($userList as $user) {
  $query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
  mysql_query($query);
}

Ce qui nous donnera

INSERT INTO users (first_name,last_name) VALUES("John", "Doe");
INSERT INTO users (first_name,last_name) VALUES("Jane", "Doe");
...

Vous pouvez faire ceci

    $userData = [];
foreach ($userList as $user) {
  $userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $iserData);
mysql_query($query);

Au final, on obtient qu’une seule requête INSERT avec autant de VALUES que d’utilisateurs à créer.

INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...

Edito

Bienvenue sur Mémorandom.

Mémorandom est le blog de 2 développeurs web, Appo et Nico.

Vous y trouverez des informations sur différents domaines touchant de près ou de loin au développement web

Tutoriels Yii Framework

Nos derniers articles

Blogs Dev

Liens

Étiquettes