Page 1 sur 1

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

Posté : 30 déc. 2006, 04:06
par pirquessa
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

Posté : 30 déc. 2006, 04:16
par Xenon_54
MySQL 4.0 ne supporte pas très bien les subqueries (sous-requêtes)
Il faudrait alors passer à 4.1 ou 5.0

Posté : 30 déc. 2006, 04:30
par pirquessa
impossible ... je ne suis pas sur un serveur dedié ...

Posté : 30 déc. 2006, 04:56
par Xenon_54
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.

Posté : 30 déc. 2006, 09:45
par pirquessa
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à tout de suite on voit carrément mieux !! Bravo au designer !!\r\n\r\nPs: Ca va être carrément plus simple pour le concours de logo vu que l'on voit à 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é à tous ceux qui ont travaillé 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 à inté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 ?

Posté : 30 déc. 2006, 18:54
par Xenon_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

Posté : 31 déc. 2006, 00:14
par pirquessa
#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

Posté : 31 déc. 2006, 09:58
par Cyrano
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

Posté : 31 déc. 2006, 11:18
par pirquessa
#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 !

Posté : 31 déc. 2006, 12:42
par Cyrano
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");

Posté : 31 déc. 2006, 13:09
par pirquessa
oui, je pense que c'est la seule solution, merci bc :)