Problème lors d'une requette du type SELECT * FROM (SELECT

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 : Problème lors d'une requette du type SELECT * FROM (SELECT

par pirquessa » 31 déc. 2006, 13:09

oui, je pense que c'est la seule solution, merci bc :)

par Cyrano » 31 déc. 2006, 12:42

Alors il ne te reste que la requête UNION comme je t'expliquais hier en privé suivi d'un traitement du retour par programmation :
Tu auras deux lignes de données et il te suffira de faire un truc du style:

Code : Tout sélectionner

SELECT COUNT( live_com.id ) AS nombre FROM live_com WHERE id_user = 1 UNION SELECT COUNT( news_com.id ) AS nombre FROM news_com WHERE user =1;
Pour le résultat suivant :

Code : Tout sélectionner

+--------+ | nombre | +--------+ | 4 | | 3 | +--------+
Avec ensuite :
$total = 0;
$sql = "SELECT COUNT( live_com.id ) AS nombre ".
       "FROM live_com ".
       "WHERE id_user = 1 ".
       "UNION ".
       "SELECT COUNT( news_com.id ) AS nombre ".
       "FROM news_com ".
       "WHERE user =1;";
//...
// code de connexion et d'exécution SQL
//...
$exec = mysql_query($sql);
while(false != ($n = mysql_fetch_assoc($exec)))
{
    $total += $n['nombre'];
}
/* Affichage de vérification */
$s = ($total > 0) ? "s" : null;
echo("<p>Total : ". $total ." message". $s ."</p>\n");

par pirquessa » 31 déc. 2006, 11:18

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT COUNT( news_com.id )
FROM news_com
WHERE user
Marche pas non plus :(

Bonne derniere journée de 2006 et bonne année 2007 des demain !

par Cyrano » 31 déc. 2006, 09:58

La même corrigée et fonctionnelle (il manquait une paire de parenthèses) sous MySQL 5.0 :

Code : Tout sélectionner

SELECT (COUNT( live_com.id ) + ( SELECT COUNT( news_com.id ) FROM news_com WHERE user =1 )) AS nombre FROM live_com WHERE id_user = 1;
Me donne le résultat suivant :

Code : Tout sélectionner

mysql> SELECT (COUNT( live_com.id ) + ( -> SELECT COUNT( news_com.id ) -> FROM news_com -> WHERE user =1 )) AS nombre -> FROM live_com -> WHERE id_user = 1; +--------+ | nombre | +--------+ | 7 | +--------+ 1 row in set (0.00 sec)
Mais j'ai un doute avec MySQL 4.0, les sous-requêtes ne sont supportées qu'à partir de MySQL 4.1 :-k

par pirquessa » 31 déc. 2006, 00:14

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT COUNT( id )
FROM news_com
WHERE user =1 ) AS nombre
F

par Xenon_54 » 30 déc. 2006, 18:54

Peux-tu tester cette requête? Je ne peux malheureusement pas tester sous MySQL 4.0, j'ai seulement 5.0 :-/

Code : Tout sélectionner

SELECT COUNT( id ) + ( SELECT COUNT( id ) FROM news_com WHERE user =1 ) AS nombre FROM live_com WHERE id_user =1

par pirquessa » 30 déc. 2006, 09:45

1er base avec données :
CREATE TABLE `live_com` (
  `id` int(6) NOT NULL auto_increment,
  `id_live` int(5) NOT NULL default '0',
  `id_user` int(8) NOT NULL default '0',
  `id_art` int(8) NOT NULL default '0',
  `art_type` tinyint(1) NOT NULL default '0',
  `texte` text NOT NULL,
  `date` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=318 ;

-- 
-- Contenu de la table `live_com`
-- 

INSERT INTO `live_com` VALUES (6, 4, 1, 2, 1, 'Bon live !', 1161984492);
INSERT INTO `live_com` VALUES (7, 4, 1, 3, 1, 'ca aurait ete bien de le mettre ici carement si les orgas sont ok ... Quelques photos sinon?', 1161984532);
INSERT INTO `live_com` VALUES (8, 4, 844, 3, 1, 'Oui c'est UP !', 1161984972);
INSERT INTO `live_com` VALUES (13, 4, 1, 9, 1, 'Aie c'est grave la galere... les matchs doivent commencer quand ?', 1162025072);
INSERT INTO `live_com` VALUES (14, 4, 1, 7, 1, 'des choses qui arrivent ... :(', 1162025102);
INSERT INTO `live_com` VALUES (15, 4, -1, 10, 1, ':) :) des photos des photos ??? :)', 1162027088);
INSERT INTO `live_com` VALUES (16, 4, 844, 10, 1, 'ca arrive ;)', 1162027335);
Seconde base avec données :
CREATE TABLE `news_com` (
  `id` int(6) NOT NULL auto_increment,
  `date` int(10) NOT NULL default '0',
  `news` int(6) NOT NULL default '0',
  `user` int(6) NOT NULL default '0',
  `texte` text NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1279 ;

-- 
-- Contenu de la table `news_com`
-- 

INSERT INTO `news_com` VALUES (1, 1156983769, 264, 424, 'Wahouuu quelle est bien cette nouvelle version ! Avec tout ces lots de qualitay on devrait voir du monde arriver :D');
INSERT INTO `news_com` VALUES (2, 1156983963, 264, 1, 'J'espere bien ! :)');
INSERT INTO `news_com` VALUES (3, 1157006222, 264, 722, 'AHhhhhhhhhhhhh !!!!!! Bas l&agrave; tout de suite on voit carr&eacute;ment mieux !! Bravo au designer !!\r\n\r\nPs: Ca va &ecirc;tre carr&eacute;ment plus simple pour le concours de logo vu que l'on voit &agrave; quoi ressemble le site maintenant !!');
INSERT INTO `news_com` VALUES (4, 1157014576, 264, 668, 'hihi c'est joli :)');
INSERT INTO `news_com` VALUES (5, 1157015076, 264, 608, 'Pas mal, j'aime bien =)');
INSERT INTO `news_com` VALUES (6, 1157015142, 264, 1, 'Ouf, j'ai eu chaud ! :) merci :)');
INSERT INTO `news_com` VALUES (7, 1157016585, 264, 456, 'Bien Jouer Pirquessa et les autre pour cette news version ... :D BJ');
INSERT INTO `news_com` VALUES (9, 1157017254, 264, 1, 'Hum c'est tout de moi la :p sauf le design :)');
INSERT INTO `news_com` VALUES (10, 1157017452, 264, -1, 'Bien jou&eacute; &agrave; tous ceux qui ont travaill&eacute; dessus :).\r\nvin100bk (htt://www.online-area.net)');
INSERT INTO `news_com` VALUES (11, 1157019531, 264, 112, 'j'avais bien dit que les commentaires serait bien &agrave; int&eacute;grer ;)');
INSERT INTO `news_com` VALUES (12, 1157019626, 264, 833, 'jolie design :)');
J'espere qu'on poura trouver une solution :/


Il y a t'il simplement une fonction permetant de trier 1 tableau (résultat de 3 requetes séparés) de valeur numeriques de facon coissante ou decroissante ?

par Xenon_54 » 30 déc. 2006, 04:56

Il faudra alors réécrire ta requête afin d'être compatible MySQL 4.0

Peux-tu fournir un extrait des 2 tables en question? Cela me faciliterait la tâche.

par pirquessa » 30 déc. 2006, 04:30

impossible ... je ne suis pas sur un serveur dedié ...

par Xenon_54 » 30 déc. 2006, 04:16

MySQL 4.0 ne supporte pas très bien les subqueries (sous-requêtes)
Il faudrait alors passer à 4.1 ou 5.0

Problème lors d'une requette du type SELECT * FROM (SELECT

par pirquessa » 30 déc. 2006, 04:06

Bonsoir à tous

Voilà bien longtemps que je n'avais pas eu besoin de mes maitres en php. Je reviens vers vous avec un gros problème ...

Premierement la requette :

Code : Tout sélectionner

SELECT count(id) as nombre FROM ( SELECT id FROM live_com WHERE id_user = 1 UNION ALL SELECT id FROM news_com WHERE user = 1 )as d
Cette requette me renvoie l'erreur dans phpmyadmin :
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'ELECT count(id) as nombre FROM ( SELECT id FROM live_com WHERE
Pour debuguer j'ai découper la requette. Derniere étape fonctionnant :

Code : Tout sélectionner

SELECT id FROM live_com WHERE id_user = 1 UNION ALL SELECT id FROM news_com WHERE user = 1
Cette requette me renvoie bien une table avec les ID des deux autres...

C'est au passage du "Select * From (select * from UNION ALL select * from) as d" que les problèmes arrivent ...

J'ai donc ce problème sur cette "petite" requette ...

Et pour ceux qui trouvent ca simple j'ai le meme bug sur sa grande soeur:
$sql = "
SELECT 
	date, 
	titre,
	url
FROM 
(
		SELECT 
			live_com.date, 
			CONCAT( CONCAT( CONCAT( CONCAT( 'live/', live.nom_url ) , '/news-LIRE-' ) , live_com.id_art ) , '.html#c0' ) AS url,
			live_news.titre as titre
		FROM live_com, live, live_news
		WHERE 
			live_com.id_user ='$id'
			AND live_com.art_type =1
			AND live.id = live_com.id_live
			AND live_news.id = live_com.id_art
		GROUP BY live_com.date
	UNION ALL
		SELECT 
			live_com.date, 
			CONCAT( CONCAT( CONCAT( CONCAT( 'live/', live.nom_url ) , '/interview-LIRE-' ) , live_com.id_art ) , '.html#c0' ) AS url,
			CONCAT( 'Interview: ', live_inter.titre)as titre
		FROM live_com, live, live_inter
		WHERE 
			live_com.id_user ='$id'
			AND live_com.art_type =2
			AND live.id = live_com.id_live
			AND live_inter.id = live_com.id_art
		GROUP BY live_com.date
	UNION ALL
		SELECT 
			news_com.date, 
			CONCAT( CONCAT( 'news-LIRE-0-', news_com.news ) , '.html#c0' ) AS url,
			news.titre
		FROM 
			news_com, 
			news
		WHERE 
			news_com.user = '$id'
			AND news.id = news_com.news 
		GROUP BY news_com.date
) AS d
ORDER BY date DESC
LIMIT 8";
J'espere que vous pourrez m'aider ... Il est maintenant 3h du matin et je n'ai pas de solution :(

Page incriminé

INFO complémentaire:
Pas d'erreur en local avec une version 5 de mysql

Erreur sur le net avec la version 4.0.25 de mysql

PS: bonne année tout de meme