2011-09-20 4 views
2

J'ai une requête mysql existante à laquelle je dois ajouter et je ne sais pas comment procéder.Aide avec la requête mysql complexe

Voici ma requête SQL actuelle.

SELECT tbl_brokerage_names.brokerage_id, tbl_brokerage_names.short_name, 
    b.indication, b.max_indication 
    FROM tbl_brokerage_names 
    LEFT JOIN (
    SELECT * FROM tbl_recommendation_brokerages 
    WHERE recommendation_id = {$_GET['id']} 
) b ON (tbl_brokerage_names.brokerage_id = b.brokerage_id) 
ORDER BY tbl_brokerage_names.short_name ASC 

Voici la requête dont j'ai besoin pour travailler dans la requête précédente.

SELECT * , COUNT(*) 
    FROM tbl_streetaccounts 
    JOIN tbl_brokerage_names 
WHERE tbl_brokerage_names.brokerage_id = tbl_streetaccounts.brokerage_id 

Fondamentalement, j'ai besoin de retourner un nombre, donc j'ai besoin de combiner ces deux requêtes.

Répondre

1

Vous devez les exécuter en tant que deux requêtes distinctes.

La requête COUNT(*) renvoie une seule ligne, il est donc impossible de la "combiner" avec la première requête tout en préservant le résultat multi-lignes de la première requête.

De plus, lorsque vous SELECT *, COUNT(*) vous obtiendrez des colonnes de certaines lignes arbitraires. Par ailleurs, vous avez une faille de SQL injection flagrante. Ne pas interpoler les paramètres $_GET directement dans votre requête SQL. Au lieu de cela, le contraindre à un entier:

<?php 
$id = (int) $_GET['id']; 
$sql = "SELECT ... WHERE recommendation_id = {$id}"; 
+0

Est-ce possible si je change COUNT (*) en COUNT (tbl_streetaccounts.brokerage_id) –

+0

@Bill, je n'approuve pas cette solution, elle casse quand on travaille avec des chaînes. Pourquoi ne pas utiliser 'mysql_real_escape_string()' et '" SELECT ... O WH recommandation_id = '$ id' ";'. C'est toujours sûr, que ce soit un entier ou une chaîne. – Johan

+0

@Johan: dans les cas où la colonne "id" doit être comparée à un entier (ce qui est pratiquement toujours vrai), il est plus simple et plus rapide de simplement contraindre la valeur à '(int)'. Si la colonne id est un non-entier, vous pouvez utiliser mysql_real_escape_string comme vous le dites. –

0

Comme dit @ Bill, vous ne pouvez pas obtenir le nombre dans chaque ligne sans syntaxe vraiment bizarre, mais vous pouvez obtenir un décompte global à l'aide GROUP BY ... WITH ROLLUP.

.: par exemple

<?php 
$id = mysql_real_escape_string($_GET['id']); //works with anything, not just numbers 
$query = " 
    SELECT tbl_brokerage_names.brokerage_id 
     , tbl_brokerage_names.short_name 
     , b.indication 
     , b.max_indication 
     , count(*) as rowcount 
    FROM tbl_brokerage_names 
    LEFT JOIN (
     SELECT * FROM tbl_recommendation_brokerages 
     WHERE recommendation_id = '$id' //The single quotes are essential for safety! 
    ) b ON (tbl_brokerage_names.brokerage_id = b.brokerage_id) 
    GROUP BY tbl_brokerage_names.brokerage_id WITH ROLLUP 
    ORDER BY tbl_brokerage_names.short_name ASC 
"; 

Le GROUP BY .. WITH ROLLUP ajoutera une ligne supplémentaire à ce résultat avec tous les NULL pour les colonnes non agrégées et un grand nombre total.

Si vous avez des lignes où rowcount > 0 alors vous devez ajouter des clauses supplémentaires de la table b à la clause group by pour empêcher MySQL de masquer des lignes arbitraires.
Le tableau tbl_brokerage_names est déjà entièrement défini car vous êtes en train de regrouper par clé primaire.