select compliqué sur une table

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 : select compliqué sur une table

par HD » 01 janv. 2007, 19:18

J imaginais bien que c'était une boucle sur mysql_fetch_assoc mais j'avais dû mal à imaginer les détails
en tous cas là c'est bon ! merci bcp !!!

par Ajoloca » 01 janv. 2007, 19:12

Si tu as plusieurs résultats, tu fais simplement une boucle.
<?
include ("connectbase.php");

$count = "SELECT COUNT(DISTINCT cat) FROM lot INTO @var";
$execCount = mysql_query($count) or die(mysql_error());

$selectCount = "SELECT lotid, COUNT(DISTINCT cat) AS cnt FROM lot GROUP BY lotid HAVING cnt = @var";
$execSelectCount = mysql_query($selectCount) or die(mysql_error());
while($dataSelectCount = mysql_fetch_assoc($execSelectCount)){
   $result[] = $dataSelectCount;
}

echo "D2BUT <br>";
print_r($result);
echo "<br> FIN";
?>

par HD » 01 janv. 2007, 18:44

je sèche |*() :cry:
soluce svp :roll:

Rappel du code actuel :
<?
include ("connectbase.php");

$count = "SELECT COUNT(DISTINCT cat) FROM lot INTO @var";
$execCount = mysql_query($count) or die(mysql_error());

$selectCount = "SELECT lotid, COUNT(DISTINCT cat) AS cnt FROM lot GROUP BY lotid HAVING cnt = @var";
$execSelectCount = mysql_query($selectCount) or die(mysql_error());
$dataSelectCount = mysql_fetch_assoc($execSelectCount);

echo "D2BUT <br>";
print_r($dataSelectCount);
echo "<br> FIN";
?> 

par HD » 01 janv. 2007, 18:35

Ouh la, j'ai bien peur que tu sois bon pour un retour aux tutoriels PHP/MySQL... :roll:

Combien de fois exécutes-tu mysql_fetch_assoc() ? Une seule fois, donc tu récupères une seule ligne. Si tu veux en récupérer plusieurs, tu sais ce qu'il te reste à faire :lol:
:langue: :langue: :langue: :tir2:
je sais !
j'ai l impression que cette erreur ne vient que de ma (mauvaise) gestion des résultats de la 2ème requête SQL...
je suis un phpéiste moi, pas un sqliste :roll:
merci !

par Hubert Roksor » 01 janv. 2007, 18:32

Ouh la, j'ai bien peur que tu sois bon pour un retour aux tutoriels PHP/MySQL... :roll:

Combien de fois exécutes-tu mysql_fetch_assoc() ? Une seule fois, donc tu récupères une seule ligne. Si tu veux en récupérer plusieurs, tu sais ce qu'il te reste à faire :lol:

par HD » 01 janv. 2007, 18:24

même problème :?
D2BUT
Array ( [lotid] => 6 [cnt] => 3 )
FIN

par Ajoloca » 01 janv. 2007, 18:22

Bonjour,
Essaie ceci
<?
include ("connectbase.php");

$count = "SELECT COUNT(DISTINCT cat) FROM lot";
$execCount = mysql_query($count) or die(mysql_error());

$nbrCat = mysql_result($execCount, 0, 0);
$selectCount = "SELECT lotid, COUNT(DISTINCT cat) AS cnt FROM lot GROUP BY lotid HAVING cnt = ".$nbrCat;
$execSelectCount = mysql_query($selectCount) or die(mysql_error());
$dataSelectCount = mysql_fetch_assoc($execSelectCount);

echo "D2BUT <br>";
print_r($dataSelectCount);
echo "<br> FIN";
?> 

par HD » 01 janv. 2007, 18:12

Code : Tout sélectionner

SELECT COUNT(DISTINCT cat) FROM lot INTO @var
suivi de

Code : Tout sélectionner

SELECT lotid, COUNT(DISTINCT cat) AS cnt FROM lot GROUP BY lotid HAVING cnt = @var
Salut et merci à tous pour votre aide
supposons la table suivante :

Code : Tout sélectionner

-- -- Structure de la table `lot` -- CREATE TABLE `lot` ( `id` int(11) NOT NULL auto_increment, `lotid` int(11) NOT NULL default '0', `cat` int(11) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; -- -- Contenu de la table `lot` -- INSERT INTO `lot` VALUES (1, 9, 0); INSERT INTO `lot` VALUES (2, 7, 0); INSERT INTO `lot` VALUES (3, 9, 1); INSERT INTO `lot` VALUES (4, 6, 1); INSERT INTO `lot` VALUES (5, 9, 2); INSERT INTO `lot` VALUES (6, 6, 2); INSERT INTO `lot` VALUES (8, 6, 0);
je vais executer le script suivant dessus :
<?
include ("connectbase.php");

$count = "SELECT COUNT(DISTINCT cat) FROM lot INTO @var";
$execCount = mysql_query($count) or die(mysql_error());

$selectCount = "SELECT lotid, COUNT(DISTINCT cat) AS cnt FROM lot GROUP BY lotid HAVING cnt = @var";
$execSelectCount = mysql_query($selectCount) or die(mysql_error());
$dataSelectCount = mysql_fetch_assoc($execSelectCount);

echo "D2BUT <br>";
print_r($dataSelectCount);
echo "<br> FIN";
?>
résultat :
D2BUT
Array ( [lotid] => 6 [cnt] => 3 )
FIN
vous remarquez donc qu'il n'affiche que le lotid 6 alors que le lotid 9 est également correct
j'ai l impression que cette erreur ne vient que de ma (mauvaise :?: :roll: ) gestion des résultats de la 2ème requête SQL...

par Xenon_54 » 01 janv. 2007, 06:17

Hubert, tu lis dans mes pensées.

J'avais justement pensé à comparer le nombre de catégorie dans lesquels les lotid se retrouvaient mais j'avais laissé tombé pour une raison inconnue. :P

par Ajoloca » 01 janv. 2007, 06:13

Merci Hubert !

par Hubert Roksor » 01 janv. 2007, 06:12

Code : Tout sélectionner

SELECT COUNT(DISTINCT cat) FROM lot INTO @var
suivi de

Code : Tout sélectionner

SELECT lotid, COUNT(DISTINCT cat) AS cnt FROM lot GROUP BY lotid HAVING cnt = @var

par Ajoloca » 01 janv. 2007, 06:07

Re,
Est-ce possible de conserver ce 4 dans une variable MySQL (@var)???

par Hubert Roksor » 01 janv. 2007, 06:00

Je viens de tester la solution corrigée d'Ajoloca et MySQL 5.0 s'en sort carrément bien. Si on n'utilise pas de sous-requête on obtient même de meilleures solutions qu'avec des auto-jointures pour peu que les données soient réparties un tant soit peu uniformément.

Donc à priori la solution ultime serait

Code : Tout sélectionner

SELECT COUNT(DISTINCT cat) AS cnt FROM lot
suivi de

Code : Tout sélectionner

SELECT lotid, COUNT(DISTINCT cat) AS cnt FROM lot GROUP BY lotid HAVING cnt = 4
(où le 4 provient de la requête précédente)

par HD » 01 janv. 2007, 05:53

Est-ce que tu veux récupérer les lotid qui sont dans le plus de catégories possibles ou alors qui sont dans toutes les catégories? (1 à 6 dans ton cas)
selon les cas 'formulaire de recherche en amont), on peut avoir 2 ou plusieurs catégories
on cherche ainsi les lotid figurant dans toutes les catégories !

par Hubert Roksor » 01 janv. 2007, 05:51

C'est normal, c'est parce que j'ai foiré la condition de jointure :)
J'ai corrigé mon post précédent, la condition doit être (lotid), pas (lotid,cat).