0
votes

Récupérer des enregistrements uniques à partir de données en double sans utiliser de groupe par

J'ai un problème avec groupe par strong>. Pour une raison quelconque, je ne peux pas l'utiliser. Donc, je cherche une solution alternative. J'utilise des webhosting en ligne et avec groupe par strong> je reçois cette erreur: xxx pré>

bit intro: strong> Je fais un site web de restaurant et Dans la table forte> Invité forte> J'ai tous les guest_code strong> qui est unique. À l'intérieur de la table forte> Il y a tous les achats de l'invité avec acheteur et guest_code strong> p>

Table: Strong> Achat P >

+-----------------------------------+--------------------+
|purchaseid | guest_code |   name   |  gid  | guest_code | 
+-----------------------------------+--------------------+
|    1      | CUST7408668|    Mia   |   1   | CUST7408668|
|    3      | CUST4425874|    zoi   |   5   | CUST4425874|
+------------------------+----------+--------------------+


0 commentaires

5 Réponses :


1
votes

Agrégation avant de rejoindre:

 SELECT p.purchaseid, p.guest_code, g.name,    
 FROM (SELECT MIN(p.purchaseid) as purchaseid, p.guest_code
       FROM purchase p
       GROUP BY p.guest_code
      ) p JOIN
      guest g
      ON p.guest_code = g.guest_code;


3 commentaires

# 1055 - Expression n ° 3 de Select List n'est pas dans le groupe par clause et contient une colonne non contenue 'denieeuwe_db.g.name "qui ne dépend de manière non fonctionnelle des colonnes du groupe par clause; Ceci est incompatible avec sql_mode = seulement_full_group_by


Merci beaucoup d'avoir posté votre réponse.


@navjotsingh. . . La requête extérieure ne doit pas avoir le groupe par . J'ai corrigé la réponse.



1
votes

On dirait que vous voulez l'ID d'achat minimum. Vous pouvez utiliser min () code> pour cela. Vous devrez peut-être également étendre la clause Group par code> avec les autres colonnes.

SELECT min(purchase.purchaseid) purchaseid,
       purchase.guest_code,
       guest.guest_code,
       guest.name
       FROM purchase
            INNER JOIN guest
                       ON purchase.guest_code = guest.guest_code
       GROUP BY purchase.guest_code,
                guest.guest_code,
                guest.name;


1 commentaires

Supprimer la virgule de la dernière visite de la colonne de Fetch.nom, sinon c'est ma réponse! Merci beaucoup pour ça.



1
votes

Vous pouvez utiliser le code invité distinct sur la table d'achat pour supprimer des données en double, car vous ne faites aucune agrégation

SELECT DISTINCT( purchase.guest_code ), 
               purchase.purchaseid, 
               guest.guest_code, 
               guest.NAME, 
FROM   purchase 
       INNER JOIN guest 
               ON purchase.guest_code = guest.guest_code 


3 commentaires

pouvez-vous si moi comment en donnant un exemple approprié?


Exemple ajouté pour la requête ci-dessus


J'apprécie votre contribution, mais ce n'est pas ce que je cherche.



1
votes

Peut être un moyen le plus simple, en utilisant uniquement Guest_code dans le groupe, car sa relation correspondante.

  SELECT MIN(purchase.purchaseid) AS purchaseid,
     purchase.guest_code, 
     guest.Name,
     guest.gid,  
     guest.guest_code
  FROM purchase
  INNER JOIN guest 
  ON purchase.guest_code=guest.guest_code 
  GROUP BY purchase.guest_code
  ORDER BY 1;


0 commentaires

0
votes

Mise à jour de la question

J'ai contacté l'équipe technique WebHost et c'est ce qu'ils disent sur cette question.

salut,

sur l'hébergement partagé, cela n'est pas autorisé car vous modifiez la base de données Comportement de serveur pour tous les autres sites Web.

Mais vous pouvez modifier vos requêtes SQL pour obtenir un comportement similaire en utilisant Any_Value () pour chaque colonne non gré.

par exemple.

Sélectionnez Nom, adresse, max (âge) du groupe T par nom;

échoue, car l'adresse n'est pas dans le groupe par.

Utilisation:

Sélectionnez Nom, Any_Value (Adresse), Max (Age) du groupe T par nom;

fonctionne de l'autre côté et produit un résultat similaire à la désactivation Seul_full_group_by

Explication de MySQL:

Si seulement_full_group_by est désactivé, une extension MySQL à la norme Utilisation SQL du groupe en permet la liste de sélection, la condition ou Ordre par liste de se référer à des colonnes non gré même si les colonnes ne dépendent pas fonctionnellement du groupe par colonnes. Cela provoque MySQL accepter la requête précédente. Dans ce cas, le serveur est libre de Choisissez une valeur de chaque groupe, alors à moins qu'ils ne soient identiques, le Les valeurs choisies sont non numériques, ce qui n'est probablement pas ce que vous vouloir. En outre, la sélection des valeurs de chaque groupe ne peut pas être influencé par l'ajout d'une commande par clause. Le tri des résultats de résultats se produit après que les valeurs ont été choisies et que l'ordre n'écoule pas. Valeur dans chaque groupe Le serveur choisit. Désactivation Seul_full_group_by est utile principalement lorsque vous le savez, en raison de Propriété des données, toutes les valeurs de chaque colonne non contenue non nommé dans le groupe en sont les mêmes pour chaque groupe.

Vous pouvez obtenir le même effet sans désactiver uniquement_full_group_by En utilisant Any_Value () pour faire référence à la colonne non gré.


0 commentaires