MYSQL Calculs entre deux tables

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : MYSQL Calculs entre deux tables

Re: MYSQL Calculs entre deux tables

par moogli » 23 mars 2012, 23:18

et on en fait de requête dans une boucle ^^

@+

Re: MYSQL Calculs entre deux tables

par Mazarini » 23 mars 2012, 22:02

non, avec phpmyadmin tu fais un
create view VueA as select site,count(*) as nbsite from TableA group by site
La meme chose pour la tableB

Ensuite tu peux faire une jointure sur VueA et VueB comme si c'était des tables.

(je ne suis pas sur de la syntaxe du create vue)

Re: MYSQL Calculs entre deux tables

par AmateurJava » 23 mars 2012, 12:39

Merci pour vos réponses.

Donc je vais faire 2 requetes :
une qui va compter les sites sur la table A et à l’intérieur de la boucle mysql_fetch_array , je vais faire le comptage des éléments dans la table B basé sur site
et j'afficherais le résultat comme je le désire.... puisque j'ai pas le choix :cry:

Re: MYSQL Calculs entre deux tables

par Mazarini » 23 mars 2012, 10:53

Le problème du comptage sur une jointure est qu'une jointure est un produit cartésien des 2 tables dans lequel on sélectionne des lignes. Comme tu as des doublons dans tes 2 tables, le même enregistrement sera répété de chaque coté.
1 A1 et 1 B2 d'un coté et de l'autre 1 A2 et 1 B2 ca donne forcément :
1 A1 1 A2
1 A1 1 B2
1 B1 1 A2
1 B1 1 B2
A partir de la plus possible de compter. Tu es donc obligé de faire les comptages avant de faire la jointure.

Pour ce qui concerne les requêtes imbriquées, il faut voir leur cout (volume traité) et leur fréquence d'utilisation. En fonction de ces paramètres, on peut envisagé des solutions différentes. Une requête couteuse et rare n'est pas forcement génante. Si la requete est fréquente, on peut stocker le résultat si l'on ne tient pas absolument à avoir un résultat "juste" et que le résultat calculé 1 fois par jour (ou autre fréquence)) est suffisant.

@Moogli : En théorie il est toujours possible de ne pas faire de rubriques imbriquées. Mais je serai bien en peine de te le prouver. J'ai tendance à utiliser des vues car ce n'est pas des requetes imbriquées (enfin pour moi) et ca simplifie souvent l'écriture des requêtes.

Re: MYSQL Calculs entre deux tables

par moogli » 23 mars 2012, 10:21

salut,

tu cherche à faire deux requêtes donc ben je vois pas le problème :)

si tu veux tout dans une seul la technique de Mazarini doit fonctionner je pense, et de toute façon les sgbd sont fait pour cela.
J'ajouterais que tu souhaite mettre ensemble deux infos totalement différentes : le nombre de site total et le nombre d'élément par site.
le nombre de site est simple
le nombre d'élement par site nécéssite un group by !
la soit tu met les deux ensemble mais tu va te balader le nb total de site pour chaque site => anerie
soit deux requêtes, quand on peux pas faire autrement on faite deux requêtes, et c'est le cas quand les infos n'ont rien a voir (je ne demande à un chausseur le nombre de marque de pompes qu'il a quand je veux acheter un pull :mrgreen: )

tu peux aussi t'orienter vers une vue plus complexe ou une procédure stockée.

ce n'est pas une hérésie de faire une requête avec des requêtes imbriquées, c'est courant et parfois obligé.

les fonctions de groupe comme count (ou max / min etc) ne sont pas trivial à utiliser malgré leurs apparentes simplicités. (tu n'a pas de group by d'ailleurs, ceci pourrait surement t'aider.).

donc au final
select count(*) as nbtotal from A; (vu qu'a priori le site est la référence de la table A après si tu a plusieurs site à la même adresse et que tu veux que les adresses faut un distinct adresse.
select count(*) as nbelementparsite, site from b group by site;

Si par contre tu peux avoir des doublons de site dans les deux alors une requêtes avec un group by, pourquoi pas ceci dit je ne suis pas sur qu'il y ai pas un bordel.
la jointure avec left ou right suivant le sens que tu soouhaite va te permettre d'avoir des "null" la où le sgbd ne trouve d'infos à mettre (et ne pas exclure l'enregistrement parce que pas de correspondance).

@+

Re: MYSQL Calculs entre deux tables

par AmateurJava » 23 mars 2012, 09:55

Cela reviendrait à faire 2 requêtes imbriquées...
Je cherche à ne faire qu'une seule requête.

Re: MYSQL Calculs entre deux tables

par Mazarini » 22 mars 2012, 21:59

A mon avis, il faut créer 2 vues pour faire les cumuls et faire une jointure (left joint) pour avoir le résultat final

Re: MYSQL Calculs entre deux tables

par AmateurJava » 22 mars 2012, 17:17

J'ai essayé les jointures, mais cela ne marche pas :
ex :
table A :
site adresse
1 adr1
1 adr2
1 adr3
2 adr4
2 adr5
3 adr6
4 adr7

Table B:
site element
1 elt1
1 el2
3 el3

Je cherche a sortir une statistique:
site adresse element
1 3 2
2 2 0
3 1 1
4 1 0

Avec LEFT JOIN, je ne tombe pas sur ce type de résultat ... a moins que ma requête soit mal montée dans les essais que j'ai fait.

Re: MYSQL Calculs entre deux tables

par Spols » 22 mars 2012, 13:18

Tu dois probablement faire une jointure entre tes tables

LEFT JOIN tableb t2 ON t1.site = t2.site

Mais je n'ai pas bien compris ce que tu désire pour t'aider mieux. Le nombre d'addresse de la table 1 OK, mais quelle nombre de site veux tu, le nombre total ou en fait le nombre d'adresse ayant au moins un élément ?

MYSQL Calculs entre deux tables

par AmateurJava » 22 mars 2012, 08:28

Bonjour,
j'ai du mal à optimiser une requete.
J'ai une table A:
champs :
site
adresse

une table B:
site
element

Je cherche à créer une requete unique qui va calculer le nombre d'adresse de la table A et le nombre d’elements de la table B sachant que le lien entre les 2 tables est site , que tous les sites de A ne sont pas présents dans B et que il peut y avoir plusieurs fois site (identiques) dans la table B
J'ai essayé SELECT COUNT(t1.site) as tt,SUM(t2.elements) as tt2 FROM A as t1,B as t2 WHERE t1.site=t2.site
Mais la requête ne calcule que les totaux des sites présents dans les 2 tables et le résultat est erroné.

Quelqu'un saurait m'aider?