Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1105 connectés 

 


Débat n°1




Attention si vous cliquez sur "voir les résultats" vous ne pourrez plus voter

 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  20  21  22  23  24  25
Auteur Sujet :

BlaBla@SQL

n°2353942
rasthor
Posté le 18-05-2020 à 11:44:52  profilanswer
 

Reprise du message précédent :
Hello!
 
Question de perf:
 
Je charge une table complète (2.5 millions de lignes, 19 colonnes) dans pandas (pd.read_sql_query(SELECT * FROM table)).
 
Cela met 1 minute. Est-ce que cela vous semble lent ou ok ? :??:
 

mood
Publicité
Posté le 18-05-2020 à 11:44:52  profilanswer
 

n°2353946
eclaireur
Posté le 18-05-2020 à 11:50:26  profilanswer
 

Full scan, donc tu pourras pas améliorer plus que ça.
 
Sauf a forcer du parallélisme, mais c'est à double tranchant, par rapport à la réconciliation des threads.

n°2353947
rasthor
Posté le 18-05-2020 à 11:51:09  profilanswer
 

eclaireur a écrit :

Full scan, donc tu pourras pas améliorer plus que ça.
 
Sauf a forcer du parallélisme, mais c'est à double tranchant, par rapport à la réconciliation des threads.


Ok, merci. :jap:

n°2353948
rasthor
Posté le 18-05-2020 à 11:54:13  profilanswer
 

Mais est-ce que la taille des données ne joue pas un role dans l'import dans pandas ? Pour le moment, je n'ai pas de typing (donc tout en full text) et pas null (les valeurs sont '' a la place).
En faisant du typing agressif, on devrait réduire la quantité de MB et donc accélérer l'import, non ? :??:

n°2353951
eclaireur
Posté le 18-05-2020 à 11:56:01  profilanswer
 

rasthor a écrit :

Mais est-ce que la taille des données ne joue pas un role dans l'import dans pandas ? Pour le moment, je n'ai pas de typing (donc tout en full text) et pas null (les valeurs sont '' a la place).
En faisant du typing agressif, on devrait réduire la quantité de MB et donc accélérer l'import, non ? :??:


 
Si, la taille des données va jouer énormément sur le contenu des pages / blocks, et sur le chainage qui en est fait ensuite.
 
D'où l’intérêt de bien choisir son type de données :o

n°2353952
rufo
Pas me confondre avec Lycos!
Posté le 18-05-2020 à 11:57:27  profilanswer
 

Quand tu parles d'import, on est bien d'accord qu'il s'agit de charger des données dans une table ?
 
Une astuce qui marche dans Mysql en général : retirer les index, charger les données puis remettre les index histoire qu'ils soient pas mis à jour à chaque insert d'enregistrement.
 
Je précise : je ne connais pas pandas.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2353953
eclaireur
Posté le 18-05-2020 à 12:00:14  profilanswer
 

rufo a écrit :

Quand tu parles d'import, on est bien d'accord qu'il s'agit de charger des données dans une table ?
 
Une astuce qui marche dans Mysql en général : retirer les index, charger les données puis remettre les index histoire qu'ils soient pas mis à jour à chaque insert d'enregistrement.

Je précise : je ne connais pas pandas.


 
Dans le monde décisionnel oui tu peux désactiver les index, pour ensuite les recalculer.
 
Mais les supprimer  [:erika_moulox:4]

n°2353954
rasthor
Posté le 18-05-2020 à 12:00:24  profilanswer
 

rufo a écrit :

Quand tu parles d'import, on est bien d'accord qu'il s'agit de charger des données dans une table ?
 
Une astuce qui marche dans Mysql en général : retirer les index, charger les données puis remettre les index histoire qu'ils soient pas mis à jour à chaque insert d'enregistrement.
 
Je précise : je ne connais pas pandas.


Non, justement. :D
 
J'ai une table qui existe deja, et je la charge dans pandas avec cette fonction:

Code :
  1. df = pd.read_sql_query(SELECT * FROM table)

n°2353960
rasthor
Posté le 18-05-2020 à 13:32:41  profilanswer
 

df = pd.read_sql_query(SELECT * FROM table) => 1 minutes.
df = pd.read_csv("table.tsv", sep="\t" ) => 3 secondes.
 
[:klemton]
 
Ca m'emmerde ces différences de performances. Si je souhaite tout charger, autant partir sur une lecture direct du fichier dans ce cas.

n°2354091
Samourai
Mais que se passe-t-il?
Posté le 19-05-2020 à 18:16:20  profilanswer
 

Bonjour,

 

J'aurais svp besoin de voir si quelqu'un pouvait me débloquer.

 

Soit une table A qui constitue des données d'emploi avec un champ "Action" (exemple : Embauche) et un champ "Motif" (exemple : Accroissement d'activité).
Les actions et les motifs sont liés entre eux.

 

Soit une table B qui constitue une table de transcodification avec une autre appli qui doit regrouper tous les couples "actions motifs".
Cette table est construite avec un champ "Number" et un champ "Value".
Quand le champ "Number" est à 3, le champ "Value" affiche l'action.
Quand le champ "Number" est à 4, le champ "Value" affiche le motif.

 


J'aimerais une requête pour identifier tous les couples manquants.

 

Voici ce que j'ai réalisé :

 

Select distinct a.action, a.motif from A
where not exists
(select b.value from B where "Number" = '4' and a.motif = b.value).

 

Du coup, ça me ressort effectivement tous les motifs qui sont absents de la table transco.
Mais idéalement, j'aurais aimé quelque chose de propre qui identifie les couples "actions motifs " absents.

 

Pourriez-vous svp me venir en aide?

 

Un grand merci.

Message cité 2 fois
Message édité par Samourai le 19-05-2020 à 18:17:33

---------------
Nihon, gambare !
mood
Publicité
Posté le 19-05-2020 à 18:16:20  profilanswer
 

n°2354120
lasnoufle
La seule et unique!
Posté le 20-05-2020 à 13:52:47  profilanswer
 

Samourai a écrit :

Bonjour,
 
J'aurais svp besoin de voir si quelqu'un pouvait me débloquer.
 
Soit une table A qui constitue des données d'emploi avec un champ "Action" (exemple : Embauche) et un champ "Motif" (exemple : Accroissement d'activité).
Les actions et les motifs sont liés entre eux.
 
Soit une table B qui constitue une table de transcodification avec une autre appli qui doit regrouper tous les couples "actions motifs".
Cette table est construite avec un champ "Number" et un champ "Value".
Quand le champ "Number" est à 3, le champ "Value" affiche l'action.
Quand le champ "Number" est à 4, le champ "Value" affiche le motif.
 
 
J'aimerais une requête pour identifier tous les couples manquants.
 
Voici ce que j'ai réalisé :
 
Select distinct a.action, a.motif from A
where not exists
(select b.value from B where "Number" = '4' and a.motif = b.value).
 
Du coup, ça me ressort effectivement tous les motifs qui sont absents de la table transco.
Mais idéalement, j'aurais aimé quelque chose de propre qui identifie les couples "actions motifs " absents.
 
Pourriez-vous svp me venir en aide?
 
Un grand merci.


Je propose un produit cartésien des 3 de B avec les 4 de B, et tu soustrais ça de A. Un truc genre:
 
Select distinct a.action, a.motif from A
minus
select b.value, c.value
from B b
cross join B c
where b."Number" = '4' and c."Number" = '3'


---------------
C'était vraiment très intéressant.
n°2354121
Samourai
Mais que se passe-t-il?
Posté le 20-05-2020 à 14:47:46  profilanswer
 

Merci, j'essaierai vendredi sur sql developper.
Mais ça s'annonce compliqué car je dois répliquer le SQL dans un applicatif et pas sûr que cross join soit faisable.


---------------
Nihon, gambare !
n°2354122
flo850
moi je
Posté le 20-05-2020 à 15:01:50  profilanswer
 

Code :
  1. SELECT DISTINCT A.action, A.motif
  2. FROM A
  3. LEFT JOIN B  as Baction on  B WHERE Baction.Number = '4' AND A.action = Baction.value
  4. LEFT JOIN B as BMotif   on  B WHERE BMotif.Number = '3' AND A.motif = BMotif.value AND Baction.action = BMotif.action /*on veut que ce soit la même ligne pour le couple action/motif */
  5.  
  6. WHERE BMotif.action IS NULL OR Baction.action IS NULL
 

un truc comme ça ?

Message cité 2 fois
Message édité par flo850 le 20-05-2020 à 15:03:11

---------------

n°2354125
lasnoufle
La seule et unique!
Posté le 20-05-2020 à 19:02:34  profilanswer
 

Samourai a écrit :

Merci, j'essaierai vendredi sur sql developper.
Mais ça s'annonce compliqué car je dois répliquer le SQL dans un applicatif et pas sûr que cross join soit faisable.


Cross join c'est dans la norme SQL... Donc ça devrait marcher, mais sinon c'est exactement la même chose qu'un dégeulasse "from B b, B c" qui lui marche quasiment partout.


---------------
C'était vraiment très intéressant.
n°2354126
lasnoufle
La seule et unique!
Posté le 20-05-2020 à 19:06:54  profilanswer
 

flo850 a écrit :

Code :
  1. SELECT DISTINCT A.action, A.motif
  2. FROM A
  3. LEFT JOIN B as Baction on B WHERE Baction.Number = '4' AND A.action = Baction.value
  4. LEFT JOIN B as BMotif on B WHERE BMotif.Number = '3' AND A.motif = BMotif.value AND Baction.action = BMotif.action /*on veut que ce soit la même ligne pour le couple action/motif */
  5.  
  6. WHERE BMotif.action IS NULL OR Baction.action IS NULL
 

un truc comme ça ?


Tu as des "B WHERE" au début de tes clauses ON (mauvais copier/coller je suppose) mais sinon ça devrait marcher et personnellement je trouve ça plus "propre" que ma solution.


---------------
C'était vraiment très intéressant.
n°2354127
flo850
moi je
Posté le 20-05-2020 à 20:03:26  profilanswer
 

Oui, voilà. Et aussi pour vérifier que tu comprennes ce que tu fais

 


Pas du tout que j'ai la concentration d'un hamster :)


---------------

n°2354128
Samourai
Mais que se passe-t-il?
Posté le 20-05-2020 à 21:38:36  profilanswer
 

Un grand merci, avec deux left join ça devrait coller dans mon appli !
 
Je vous tiens au courant vendredi


---------------
Nihon, gambare !
n°2354446
Samourai
Mais que se passe-t-il?
Posté le 26-05-2020 à 17:06:10  profilanswer
 

Bonjour,
 
J'ai testé, et ça ne marche pas avec les left join.
 
En fait il me retourne toutes les valeurs qui sont dans les deux tables :).
 
Moi je veux le contraire, je veux les valeurs qui sont dans la table A mais pas B.


---------------
Nihon, gambare !
n°2354449
skeye
Posté le 26-05-2020 à 17:10:59  profilanswer
 

t'as pas oublié les "where bidule is null" à la fin?


---------------
Can't buy what I want because it's free -
n°2354458
Samourai
Mais que se passe-t-il?
Posté le 26-05-2020 à 17:38:16  profilanswer
 

skeye a écrit :

t'as pas oublié les "where bidule is null" à la fin?


 
Ha si  :pt1cable:


---------------
Nihon, gambare !
n°2354461
flo850
moi je
Posté le 26-05-2020 à 18:33:59  profilanswer
 

Ben oui ils sont importants, vu que ce sont eux qui disent "les enregistrements qui ne satisfont pas les contraintes"


---------------

n°2354483
masklinn
í dag viðrar vel til loftárása
Posté le 27-05-2020 à 11:26:12  profilanswer
 

Bon j'ai un problème de combinaison d'aggrégation. Je pose mon cas de repro (code postgres):

Code :
  1. DROP TABLE IF EXISTS foo;
  2. DROP TABLE IF EXISTS bar;
  3. DROP TABLE IF EXISTS baz;
  4.  
  5. CREATE TABLE bar ( id serial NOT NULL PRIMARY KEY );
  6. CREATE TABLE baz ( id serial NOT NULL PRIMARY KEY );
  7. CREATE TABLE foo (
  8.       id serial NOT NULL PRIMARY KEY,
  9.       bar_id integer NOT NULL REFERENCES bar (id),
  10.       baz_id integer REFERENCES baz (id),
  11.       flag1 BOOLEAN NOT NULL,
  12.       flag2 BOOLEAN NOT NULL
  13. );
  14.  
  15. INSERT INTO bar (id) VALUES (DEFAULT), (DEFAULT), (DEFAULT);
  16. INSERT INTO baz (id) VALUES (DEFAULT);
  17. INSERT INTO foo (bar_id, baz_id, flag) VALUES
  18.    (1, 1, false, false),
  19.    (1, 1, true, false),
  20.    (1, 1, false, true),
  21.    (1, NULL, false, true),
  22.    (2, NULL, true, false),
  23.    (3, 1, false, false),
  24.    (3, NULL, true, false);


Ce dont j'aurais besoin, c'est pour chaque "bar_id" avoir les flags qui soient les OR des flags qui ont le même baz_id (c'est garanti, les records sont filtrés sur un baz_id spécifique ou baz_id is null), ou, si le précédent est NULL, le OR des flags qui n'ont pas de baz_id.
 
Donc en gros, le resultat devrait être (1, true, true), (2, true, false), (3, false, false):

  • il y a des bar_id=1 qui ont un baz_id, leur bool_or(flag1)=true, bool_or(flag2)=true
  • il n'y a que des bar_id=2 sans baz_id, leur bool_or(flag1)=true, bool_or(flag2)=false
  • il y a des bar_id=3 qui ont un baz_id, leur les OR sont false, les bar_id sans baz_id sont ignorés


J'aurais un seul flag je pourrais faire un select distinct (bar_id), flag from foo order by bar_id, baz_id nulls last, flag desc… mais j'ai plusieurs flags dont ça marche pas. Pour le moment j'arrive qu'à avoir les valeurs avec baz_id et les valeurs sans, et je dois combiner côté applicatif.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2354486
flo850
moi je
Posté le 27-05-2020 à 11:50:24  profilanswer
 

Tu peux utiliser des case when ?


---------------

n°2354488
masklinn
í dag viðrar vel til loftárása
Posté le 27-05-2020 à 12:15:08  profilanswer
 

flo850 a écrit :

Tu peux utiliser des case when ?


Sure. Si ça tourne dans Postgres 9.6 c’est bon. Même Postgres 11 pourrait passer (moins certain).


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2354489
flo850
moi je
Posté le 27-05-2020 à 12:47:35  profilanswer
 

masklinn a écrit :


Sure. Si ça tourne dans Postgres 9.6 c’est bon. Même Postgres 11 pourrait passer (moins certain).


C'est super vieux le support de ça . Et ça ne flingue pas trop les perfs, étonnamment


---------------

n°2354490
masklinn
í dag viðrar vel til loftárása
Posté le 27-05-2020 à 12:50:34  profilanswer
 

flo850 a écrit :


C'est super vieux le support de ça . Et ça ne flingue pas trop les perfs, étonnamment


Oui je sais, c’est au cas où tu veuilles proposer un truc avec des fitioures super avancées, le case…when c’est clairement pas un problème.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2354491
flo850
moi je
Posté le 27-05-2020 à 12:53:58  profilanswer
 

Le truc qui m'a sauvé la vie pour les migrations de données (y compris des fois dans des conditions de jointures , mais la les perfs faisaient la gueule)


Message édité par flo850 le 27-05-2020 à 12:54:32

---------------

n°2354635
Samourai
Mais que se passe-t-il?
Posté le 28-05-2020 à 17:46:43  profilanswer
 

Samourai a écrit :

Bonjour,

 

J'aurais svp besoin de voir si quelqu'un pouvait me débloquer.

 

Soit une table A qui constitue des données d'emploi avec un champ "Action" (exemple : Embauche) et un champ "Motif" (exemple : Accroissement d'activité).
Les actions et les motifs sont liés entre eux.

 

Soit une table B qui constitue une table de transcodification avec une autre appli qui doit regrouper tous les couples "actions motifs".
Cette table est construite avec un champ "Number" et un champ "Value".
Quand le champ "Number" est à 3, le champ "Value" affiche l'action.
Quand le champ "Number" est à 4, le champ "Value" affiche le motif.

 


J'aimerais une requête pour identifier tous les couples manquants.

 

Voici ce que j'ai réalisé :

 

Select distinct a.action, a.motif from A
where not exists
(select b.value from B where "Number" = '4' and a.motif = b.value).

 

Du coup, ça me ressort effectivement tous les motifs qui sont absents de la table transco.
Mais idéalement, j'aurais aimé quelque chose de propre qui identifie les couples "actions motifs " absents.

 

Pourriez-vous svp me venir en aide?

 

Un grand merci.

 
flo850 a écrit :

Code :
  1. SELECT DISTINCT A.action, A.motif
  2. FROM A
  3. LEFT JOIN B  as Baction on  B WHERE Baction.Number = '4' AND A.action = Baction.value
  4. LEFT JOIN B as BMotif   on  B WHERE BMotif.Number = '3' AND A.motif = BMotif.value AND Baction.action = BMotif.action /*on veut que ce soit la même ligne pour le couple action/motif */
  5.  
  6. WHERE BMotif.action IS NULL OR Baction.action IS NULL
 

un truc comme ça ?

 


Bonjour.

 

Bon, beh ça ne fonctionne pas car j'ai oublié de vous préciser un petit détail dont je pensais (à tort) pouvoir m'arranger.

 

>>>
La table B est construite de manière dégeulasse.

 

Et en fait ça fonctionne par ligne !
Tu as un champ LIGNE.

 

Par exemple :
 B.NUMBER = 3 et LIGNE 1 -->  la valeur sera l'action
 B.NUMBER = 4 et LIGNE 1 aussi-->  la valeur sera le motif

 

>>>
Faut ajouter un critère de ligne.

 

Donc du coup je l'ajoute, mais le résultat est inapproprié.

 
Code :
  1. SELECT DISTINCT A.action, A.motif, B.VALUE, C.VALUE
  2. FROM A
  3. LEFT JOIN B  Baction on  B Baction.Number = '4' AND A.action = Baction.value
  4. LEFT JOIN B CMotif   on  B CMotif.Number = '3' AND A.motif = BMotif.value AND Baction.action = CMotif.action [b] AND C.LIGNE = B.LIGne[/b]
  5. -- WHERE BMotif.action IS NULL OR Baction.action IS NULL (ligne en commentaire pour essayer de comprendre)
 

Le résultat de ça c'est qu'il me sort des lignes en double...une avec la valeur existante et une avec la valeur nulle qu'il sort de je ne sais où...(car la valeur existe).

 



Message édité par Samourai le 28-05-2020 à 17:49:30

---------------
Nihon, gambare !
n°2354657
flo850
moi je
Posté le 28-05-2020 à 21:47:22  profilanswer
 

il faut que tu enleve Baction.action = CMotif.action , non ?


---------------

n°2354703
Samourai
Mais que se passe-t-il?
Posté le 29-05-2020 à 16:50:09  profilanswer
 

C'est une coquille de copié collé du premier post, je ne l'ai pas dans la requête.


---------------
Nihon, gambare !
n°2354714
flo850
moi je
Posté le 29-05-2020 à 22:18:56  profilanswer
 

Dans le.wjere , essaye avec uniquement
Cmotif.ligne is null


---------------

n°2355020
_tchip_
Posté le 02-06-2020 à 19:52:23  profilanswer
 

Est-ce qu'il existe mieux que ça pour remplir une database perso pour la tester ?
http://www.generatedata.com/
(je ne peux pas choisir mon nombre de ligne, et les adresse françaises ne sont pas bonnes)


Message édité par _tchip_ le 02-06-2020 à 19:53:47
n°2355027
rufo
Pas me confondre avec Lycos!
Posté le 02-06-2020 à 20:32:51  profilanswer
 

C'est en bas, le nb de lignes souhaitées (par défaut, 100). Effectivement, même en remplissant le 2ème champ en haut (COUNTRY-SPECIFIC DATA), les adresses ne sont pas au format français :/ Par contre, en mettant un champ de type "region", les villes deviennent françaises mais pas les adresses :(


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2355135
mechkurt
Posté le 03-06-2020 à 16:05:51  profilanswer
 

Comment on fait en Mysql 5.5 pour avoir la dernière ligne correspondant à une jointure ?
J'ai une table client et un table ticket et bien sur y'a plusieurs ticket par client, je veux les infos client et le plusieurs infos dans la table ticket, pas juste l'id (sinon j'utiliserais MAX) correspondant au dernier ticket...
https://stackoverflow.com/questions [...] roup-mysql
J'ai vu des double jointures avec t1.id_ticket > t2.id_ticket ou des ON id_ticket IN (SELECT MAX(id_ticket ) ... GROUP BY id_client) mais tout ça me semble pas top, je suis passé à coté de quelque chose d'évident ?


---------------
D3
n°2355137
rufo
Pas me confondre avec Lycos!
Posté le 03-06-2020 à 16:26:19  profilanswer
 

Dans mon appli Astres, j'utilise cette solution (mentionnée sur ton lien) :  
SELECT p1.postid
FROM Posts p1
INNER JOIN (SELECT pi.owneruserid, MAX(pi.postid) AS maxpostid
            FROM Posts pi GROUP BY pi.owneruserid) p2
  ON (p1.postid = p2.maxpostid)
WHERE p1.owneruserid = 20860;
 
J'ai une relation tickets - états de chaque ticket. Quand je veux avoir l'état courant du ticket, je récupère son ID max via une sous-requête et dans la requête principale, je fais une jointure sur chaque id max pour avoir les autres infos liées à l'état de chaque ticket (ex : le nom de l'état, sa position dans le workflow...). Quand en Mysql 3.x y'avait pas les sous-requêtes, je te dis pas comment je galérai : obligé de passer par une table temporaire :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2355190
mechkurt
Posté le 04-06-2020 à 11:04:37  profilanswer
 

Merci, j'ai fait un truc de ce genre :

Code :
  1. SELECT
  2. ts.`id_client`,
  3. c.`type_client`, c.`civilite`, c.`nom`, c.`prenom`, c.`email`, c.`societe`, [...]
  4. MAX(ts.`id_ticket`) AS id_dernier_ticket,
  5. tr.`datetime`, tr.`num_facture`, [...]
  6. FROM `ticket_racine` ts
  7. INNER JOIN `ticket_racine` tr ON tr.`id_ticket` = ts.`id_ticket`
  8. INNER JOIN `clients` c ON c.`id_client` = ts.`id_client`
  9. WHERE ts.`valide` = 1
  10. GROUP BY ts.`id_client` 
  11. ORDER BY ts.`id_client` ASC


C'est correct ou il peut y'avoir des effets de bord genre ts.id_ticket différent de MAX(ts.id_ticket) ?


---------------
D3
n°2355192
mechkurt
Posté le 04-06-2020 à 11:08:09  profilanswer
 

Je me répond à moi même c'est pas bon jen aprocurant mes résultats j'ai des tr.id_ticket différent de mes MAX(ts.id_ticket), faut que je fasses une jointure sur un select, reloud...


---------------
D3
n°2355193
flo850
moi je
Posté le 04-06-2020 à 11:10:48  profilanswer
 

from ticket tcurrent
left join tnext on tnext.id > tcurrent.id
where tnext.id is null

 

ou

 

from ticket
where not exists (select 1 from ticket tnext where tnext.id > ticket.id)


Message édité par flo850 le 04-06-2020 à 11:11:22

---------------

n°2355198
mechkurt
Posté le 04-06-2020 à 11:44:22  profilanswer
 

Ben du coups j'ai fait :

Code :
  1. SELECT
  2.  ts.`id_client`,
  3.  c.`civilite`, c.`nom`, c.`prenom`, c.`email`, c.`societe`,
  4.  ts.id_dernier_ticket,
  5.  tr.`datetime`, tr.`num_facture`, tr.`total_ht`, tr.`tva`, tr.`total_ttc`, tr.`total_remise`
  6. FROM `ticket_racine` tr
  7. INNER JOIN (
  8.  SELECT sub.`id_client`, MAX(sub.`id_ticket`) AS id_dernier_ticket
  9.  FROM `ticket_racine` sub
  10.  WHERE sub.`valide` = 1
  11.  GROUP BY sub.`id_client`) ts ON tr.`id_ticket` = ts.id_dernier_ticket
  12. INNER JOIN `clients` c ON c.`id_client` = tr.`id_client`
  13. WHERE 1
  14. ORDER BY tr.`id_client` ASC


Et ça fonctionne (à priori ^^), de toute façon c'est un oneshot pour exporter des données à mon client via phpmyadmin donc on se fout un peu des perfs si ça marche, mais si j'ai ce besoin dans une apllications je testerais tes solutions flo850...
 
TIL: INNER JOIN (SELECT MAX(col1) AS aliascol FROM table GROUP BY col2) aliastab ON othertab.othercol = aliastab .aliascol
Vraiment bien pour pouvoir exploiter des alias dans une requête !


---------------
D3
n°2355208
rufo
Pas me confondre avec Lycos!
Posté le 04-06-2020 à 13:24:45  profilanswer
 

Ben c'est la solution que je t'avais proposée, ça, non ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2355221
mechkurt
Posté le 04-06-2020 à 14:25:35  profilanswer
 

Oui ^^
J'ai crut pouvoir gruger en mettant le MAX dans le groupe principal mais comme l'alias ne fonctionne pas ça ne sert à rien...
Mon pavé au dessus c'était pour répondre à flo850 qui proposait une solution sans INNER JOIN (SELECT), qui est peut être plus performante, faudrait tester, mais je suis content de découvrir l'astuce des alias permettant de rendre "accessible" des clause provenant de GROUP BY, je suis sur que ça me resservira ! [:azitwaz]


---------------
D3
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  20  21  22  23  24  25

Aller à :
Ajouter une réponse
 

Sujets relatifs
Requete SQL de selection complexe[SQL SERVER] Ajout d'une colonne en PS...mais inutilisable
[ODBC] DSN pour se connecter à une base SQL[PDO/SQL] Aide selection et classement (JOIN ??)
Problème conditions requete SQLSQL/PHP BDD de réservation de chambres
Jointure 'LIKE' SQL => BOtable SQL Ajouter une colonne au lieu de creer une nouvelle table
Requête SQL complexe 
Plus de sujets relatifs à : BlaBla@SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR