Maison  >  Article  >  base de données  >  Comment implémenter une requête d'épissage multi-colonnes dans les résultats de la requête MySQL

Comment implémenter une requête d'épissage multi-colonnes dans les résultats de la requête MySQL

王林
王林avant
2023-06-01 23:40:052640parcourir

J'ai déjà rencontré un problème. Il y a deux tables dans la base de données MySQL. Une table d'adresses stocke les informations de localisation telles que les provinces et les villes, et l'autre table utilisateur contient trois champs correspondant aux trois informations de localisation dans la table d'adresses (table très étrange). format), comme le montre la figure :

Comment implémenter une requête dépissage multi-colonnes dans les résultats de la requête MySQL

Comment implémenter une requête dépissage multi-colonnes dans les résultats de la requête MySQL

Maintenant, nous devons interroger les données dans la table utilisateur et interroger les informations de localisation correspondantes (nom) dans la table d'adresses en fonction de la valeur de la province et city ​​dans la table utilisateur Et affichez-le ;

Je ne maîtrise pas SQL, j'ai donc compris une logique générale

Tout d'abord, nous devons obtenir les valeurs des trois champs province et ville dans la table utilisateur. Notre méthode de requête générale est

SELECT province,city,district FROM `user` WHERE id =1;

C'est relativement simple, obtenez le résultat est la valeur d'une ligne et de trois colonnes, comme le montre la figure :

Comment implémenter une requête dépissage multi-colonnes dans les résultats de la requête MySQL

C'est la manière normale d'écrire, puis utilisez ce résultat comme condition de requête pour interroger le nom dans la table d'adresses.

Bien sûr, l'idée semble bonne, mais ceci Les résultats de la requête sont divisés en trois sections, ce qui n'est pas propice à nos requêtes ultérieures et nous ne pouvons pas récupérer les résultats. puis traitez-les avant d'interroger. C'est trop gênant pour le moment, nous devons utiliser deux fonctions SQL, CONCAT_WS et CONCAT , la fonction des deux fonctions est de fusionner les résultats en une chaîne. Baidu. Je ne le présenterai pas ici :)

Notre instruction de requête peut donc être écrite commeSELECT CONCAT_WS(',',province,city,district) AS ids FROM `user` WHERE id =1;Le résultat est comme indiqué dans la figure :

Comment implémenter une requête dépissage multi-colonnes dans les résultats de la requête MySQL

Avec ce résultat, nous pouvons essentiellement interroger les informations d'adresse de la même manière, lors de l'interrogation des informations d'adresse, nous avons également effectué l'épissage correspondant, donc le SQL final est comme ceci

SELECT GROUP_CONCAT(`name`) FROM address WHERE id IN (SELECT CONCAT_WS(',',province,city,district) FROM `user` WHERE id =1);

Le résultat idéal est celui indiqué dans la figure :

Comment implémenter une requête dépissage multi-colonnes dans les résultats de la requête MySQL

Mais en fait, cette instruction ne peut pas obtenir les résultats que nous souhaitons La raison est que le résultat de SELECT CONCAT_WS(',',province,city,district) FROM `user` WHERE id =1 est une chaîne, mais la chaîne ne peut pas être utilisée comme condition de In dans la condition de requête, donc la chaîne. le résultat de la requête n'est pas ce que nous voulons.

Analysons à nouveau notre idée et il n'y a pas de problème, alors comment pouvons-nous utiliser cette chaîne comme conditions de requête, et enfin obtenir les résultats souhaités selon les informations sur Internet ? le contenu de la condition de requête ne peut être que numérique, donc il ne prend pas en charge les requêtes de chaîne, donc ici nous avons également besoin d'une fonction, instr Pour être honnête, c'est la première fois que je connais cette fonction. un peu sur l'ajout, la suppression, la modification et la vérification de MySQL, haha. Essayons ensuite l'effet de cette fonction. Le SQL final est exécuté comme

SELECT
  GROUP_CONCAT(`name`)
FROM
  address
WHERE INSTR(
    (SELECT
      CONCAT_WS(',', province, city, district)
    FROM
      `user`
    WHERE id = 1),
    id
  ) ;

Le résultat final est également ce que nous voulons. Bien sûr, l'instruction ci-dessus ne fait que réaliser. le résultat de la recherche de l'adresse. Les détails peuvent être modifiés en fonction des besoins de l'entreprise. Il faut dire que les fonctions de mysql sont très puissantes. Nous devons encore en apprendre davantage à l'avenir ;

Donc, le sql final est :

.
SELECT
  GROUP_CONCAT(`name`)
FROM
  address
WHERE INSTR(
    CONCAT(
      ',',
      (SELECT
        CONCAT_WS(',', province, city, district)
      FROM
        `user`
      WHERE id = 1),
      ','
    ),
    CONCAT(',', id, ',')
  ) ;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer