PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 25-11-2010 16:55:35

debe
Membre
Inscription : 25-06-2009
Messages : 87

pb sur un select

bonjour,
j'ai ce select

SELECT petition.id_petition AS id_petition,
       petition.nom AS nom,
       petition.TYPE AS TYPE,
       verif_petition.id_signataire AS id_signataire
FROM petition
INNER JOIN verif_petition ON verif_petition.id_petition = petition.id_petition
WHERE petition.valid = 'oui'
      AND
      verif_petition.id_signataire <> $id_signataire
ORDER BY id_petition DESC

ce que je veux, c'est ramener les petition.nom de la table petition qui n'ont pas été signée par verif_petition.signataire

le problème de ce select, c'est qu'il marche uniquement si une autre personne a déjà signé la pétition, en fait, si l'id_petition existe dans verif_petition

ce que je veux c'est
verif.petition existe dans cette table ET verif.signataire != celui-que-je-test ==>on affiche petition.nom
verif.petition n'existe pas dans cette table => on affiche petition.nom

cela ne doit pas être compliqué mais trop longtemps dessus, je ne vois plus

Hors ligne

#2 25-11-2010 17:03:04

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : pb sur un select

>>cela ne doit pas être compliqué

je suis d'accord avec toi wink

a++

Hors ligne

#3 25-11-2010 17:05:41

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : pb sur un select

très drole !!!  tongue

Hors ligne

#4 25-11-2010 17:14:25

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : pb sur un select

bah non, c'est pas drôle roll
a++

Hors ligne

#5 25-11-2010 22:49:06

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : pb sur un select

Saluton,
En effet rien d'hilarant.
J'ai rendu ta requête plus lisible et conforme à la syntaxe SQL officielle.
Regarde du côté de LEFT JOIN.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 26-11-2010 14:38:41

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : pb sur un select

je ne comprends vraiment pas : j'ai vraiment du mal avec les tables imbriquées

je tourne en rond depuis ce matin, au mieux, j'en suis la

SELECT p.id_petition AS id_petition,
            p.nom AS nom,
            p.TYPE AS TYPE,
        v.id_signataire AS id_signataire
        FROM petition p
        LEFT JOIN verif_petition v ON v.id_petition = p.id_petition
      WHERE p.valid = 'oui' AND  v.id_signataire <> $id_signataire OR v.id_petition = ''
        ORDER BY id_petition DESC  

j'ai testé LEFT JOIN au lieu de INNER JOIN et j'ai le même souci. j'ai ajouté OR verif_petition.id_petition = '' mais cela ne change rien
==> j'ai l'affichage que si verif_petition.id_petition existe

j'ai toujours la solution de faire select nom from petition, il renvoie tout et je trie ensuite avec if mais cela va allourdir

Hors ligne

#7 27-11-2010 13:11:22

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : pb sur un select

WHERE (p.valid = 'oui' AND  v.id_signataire <> $id_signataire)
OR v.id_petition  IS NULL

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 30-11-2010 11:28:06

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : pb sur un select

merci, cela fonctionne

Hors ligne

#9 01-12-2010 10:16:37

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : pb sur un select

en fait, cela ne fonctionne pas sad
en local, je n'avait qu'une seule participation, par contre, en réelle, j'ai quelques milliers par pétitions, et la, bug car il affiche le nom de la pétition à chaque fois qu'il la rencontre : donc, des milliers de fois (bon, je l'ai arreté avant !!)

j'ai essayé

SELECT DISTINCT(verif_petition.id_petition),petition.id_petition AS id_petition,
            petc ...

mais cela ne change rien.

en fait, ce que je croyais simple ne semble pas l'être

Hors ligne

#10 01-12-2010 10:42:16

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : pb sur un select

hum vire le id_signataire de la requete (pas besoin et c'est ça qui met le brin tu récupère toute les signatures la


SELECT p.id_petition AS id_petition,
            p.nom AS nom,
            p.TYPE AS TYPE,
        FROM petition p
        LEFT JOIN verif_petition v ON v.id_petition = p.id_petition
      WHERE p.valid = 'oui' AND  v.id_signataire <> $id_signataire OR v.id_petition IS NULL
      GROUP BY p.id_petition
        ORDER BY p.id_petition DESC
 

si tu nous montrez les create tables des deux tables et un exemple de jeux de données ça pourrait aider smile (psa plus d'une vingtaine de donnée hein);

ps : pour le code SQL le bbcode c'est [ code=sql ] wink

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#11 01-12-2010 10:57:06

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : pb sur un select

ma nouvelle requete qui ne marche toujours pas

$sql = " SELECT petition.id_petition AS id_petition,
            petition.nom AS nom,
            petition.type AS type
         FROM petition
         LEFT JOIN verif_petition ON verif_petition.id_petition = petition.id_petition  
       WHERE (petition.valid = 'oui' AND  verif_petition.id_signataire <> $id_signataire)  OR verif_petition.id_petition  IS NULL "
;

ma table petition


CREATE TABLE `petition` (
  `id_petition` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
  `numero` VARCHAR(5) NOT NULL,
  `nom` VARCHAR(100) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
  `liens_trad` text NOT NULL,
  `chapeau` text,
  `presentation` mediumtext,
  `texte` mediumtext,
  `type` VARCHAR(11) NOT NULL,
  `mel` VARCHAR(255) NOT NULL,
  `img` VARCHAR(50) NOT NULL DEFAULT 'vide.gif',
  `date_debut` DATE DEFAULT NULL,
  `partenaire` VARCHAR(250) NOT NULL,
  `destinataire` VARCHAR(250) NOT NULL,
  `date_fin` DATE NOT NULL,
  `info` tinytext NOT NULL,
  `forum` VARCHAR(255) NOT NULL,
  `sujet_mail` VARCHAR(255) NOT NULL,
  `dep` CHAR(3) NOT NULL,
  `senat` VARCHAR(3) NOT NULL,
  `euro` VARCHAR(3) NOT NULL,
  `valid` VARCHAR(3) NOT NULL DEFAULT 'non',
  `pdf` VARCHAR(200) NOT NULL,
  `i` BIGINT(10) UNSIGNED NOT NULL DEFAULT '0',
  `buzz` mediumtext NOT NULL,
  PRIMARY KEY  (`id_petition`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 PACK_KEYS=1 AUTO_INCREMENT=11 ;
 

table signataires


CREATE TABLE `signataires` (
  `id_signataire` INT(255) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nom` VARCHAR(35) NOT NULL,
  `prenom` VARCHAR(45) NOT NULL,
  `profession` VARCHAR(200) NOT NULL,
  `adresse` VARCHAR(255) NOT NULL,
  `cp` VARCHAR(7) NOT NULL,
  `ville` VARCHAR(150) NOT NULL,
  `pays` VARCHAR(150) NOT NULL,
  `mel` VARCHAR(150) NOT NULL,
  `enligne` VARCHAR(3) NOT NULL,
  `date_inscrip` DATE NOT NULL,
  `datelastsign` DATE NOT NULL,
  `codevalid` VARCHAR(20) NOT NULL,
  `mdp` VARCHAR(255) NOT NULL,
  `meldep` VARCHAR(255) NOT NULL,
  PRIMARY KEY  (`id_signataire`),
  KEY `cp` (`cp`),
  KEY `pays` (`pays`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
 

table verfi pétition


-- Structure de la table `verif_petition`
--

CREATE TABLE `verif_petition` (
  `id_verif` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `id_petition` mediumint(8) UNSIGNED NOT NULL,
  `id_signataire` BIGINT(20) UNSIGNED DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `enligne` VARCHAR(3) COLLATE latin1_bin NOT NULL,
  `codevalid` VARCHAR(20) COLLATE latin1_bin NOT NULL,
  `relance` VARCHAR(2) COLLATE latin1_bin NOT NULL,
  `sujetmail` VARCHAR(255) COLLATE latin1_bin NOT NULL,
  `txtlettre` mediumtext COLLATE latin1_bin NOT NULL,
  `melelus` text COLLATE latin1_bin NOT NULL,
  PRIMARY KEY  (`id_verif`),
  KEY `id_signataire` (`id_signataire`)
) ENGINE=MyISAM AUTO_INCREMENT=1218599 DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=1218599 ;

--
-- Contenu de la table `verif_petition`
--

INSERT INTO `verif_petition` VALUES (855984, 66, 18917, '2010-03-10 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (892067, 76, 5, '2010-04-15 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (797940, 40, 19746, '2010-02-05 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1448, 8, 1443, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1449, 7, 1443, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (806300, 40, 22620, '2010-02-11 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (797800, 4, 6314, '2010-02-04 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (855983, 66, 11319, '2010-03-10 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1456, 21, 1443, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (798014, 40, 19776, '2010-02-06 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1554, 29, 860, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1557, 21, 860, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1560, 31, 860, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (855979, 67, 31828, '2010-03-10 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1628, 31, 1558, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1657, 32, 1588, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1660, 21, 1588, '2009-12-30 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (892066, 85, 5, '2010-04-15 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (855976, 66, 31828, '2010-03-10 00:00:00', '', '', '', '', '', '');
INSERT INTO `verif_petition` VALUES (1829, 4, 1228, '2009-12-30 00:00:00', '', '', '', '', '', '');
       
 

j'espere que je n'ai pas posté trop d'infos dans le forum, j'aurais peut-être du mettre sur le wall ?

Hors ligne

#12 01-12-2010 11:24:11

debe
Membre
Inscription : 25-06-2009
Messages : 87

Re : pb sur un select

Bon, pour pas trop importuner sur ce forum, en attendant, j'ai fait autre chose

$sql = " SELECT nom,type,id_petition FROM petition ORDER BY id_petition DESC";
$req = mysql_query($sql)  or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error().'<p><b>Afin de nous aider au maintient de ce site, merci d\'envoyer une copie de ce message à webmaster@cyberacteurs.org</b>');
while($data = mysql_fetch_assoc ($req))
    {
  $id_petition = $data['id_petition'];
 
    $sqlverif = " SELECT COUNT(id_verif) AS nbre FROM verif_petition WHERE id_petition = $id_petition && id_signataire = $id_signataire";
    $reqverif = mysql_query($sqlverif)  or die('Erreur SQL !<br>'.$sqlverif.'<br>'.mysql_error().'<p><b>Afin de nous aider au maintient de ce site, merci d\'envoyer une copie de ce message à webmaster@cyberacteurs.org</b>');
    while($donnee = mysql_fetch_assoc ($reqverif))
        {  
       if($donnee['nbre'] !=0): $verif='deja signe'; else : $verif='pas signé'; endif;    
     
      }
     echo $data['type'].' '.$data['nom'].' '.$verif.'<p>';
       
    }

si la première solution est faisable, cela ne serait pas plus mal, mais en attendant ....

Hors ligne

#13 01-12-2010 12:14:54

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : pb sur un select

SELECT DISTINCT peut être ?? wink

a++

Hors ligne

#14 01-12-2010 18:23:25

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : pb sur un select

hum j'ai trouver une solution (enfin chez lmoli ça marche wink ) MK nous dira surement si c'est "propre" ;


select petition.id_petition, nom, type from petition
left join verif_petition using(id_petition)
where id_petition not in (select id_petition from verif_petition where id_signataire=860)
group by id_petition
order by id_petition desc;
 

voila

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#15 02-12-2010 04:42:26

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : pb sur un select

Voilà un GROUP BY bien peu orthodoxe et une sous-requête gourmande en ressources bien inutile selon moi.
Le filtre sur id_signataire<>860 faisant partie des conditions de la jointure autant l'y intégrer.

SELECT DISTINCT p.id_petition, p.nom, p.TYPE
FROM petition p
LEFT JOIN verif_petition v
ON p.id_petition = v.id_petition
AND v.id_signataire <> 860
ORDER BY p.id_petition;

Le DISTINCT du SELECT est le seul à pouvoir supprimer les doublons sur les lignes (n-uplets) considérées sur l'ensemble de leur colonnes, ce qui constitue la seule manière logique de conserver l'intégrité référentielle entre celles-ci, le GROUP BY opérant une sélection aléatoire.
N'oubliez pas que les lignes insérées (INSERT) dans une table doivent être considérées comme des billes mises dans un sac, seuls les INDEX ou les ORDER BY permettent de les en extraire selon un ordre déterminé, le GROUP BY non.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

Pied de page des forums