2010-07-26 8 views
1

Comment réparer cette requête mysqlcomme un champ dans une [requête de sélection mysql] pour obtenir ensemble de données de tableau

SELECT no, name, 
(SELECT chapter, max FROM table2 WHERE name = user.name AND max = 10) 
    as sub_array1, 
(SELECT chapter, max FROM table2 WHERE name = user.name AND max = 20) 
    as sub_array2 
FROM user ORDER by exp DESC 

exemple résultat attendu sur:

la requête en cours me retourne Opérande doit contenir 1 colonne (s)

fondamentalement je veux créer quelque chose comme ceci:

------------------------------------------------------------------------------ 
no | name | sub_array1 
------------------------------------------------------------------------------ 
1  |myname | sub_array1[0][chapter]=chapter_1, sub_array1[0][max]=100 
     |   | sub_array1[1][chapter]=chapter_2, sub_array1[1][max]=70 
     |   | ... 
------------------------------------------------------------------------------ 
2  |myname_2 | sub_array1[0][chapter]=chapter_1, sub_array1[0][max]=100 
     |   | sub_array1[1][chapter]=chapter_2, sub_array1[1][max]=50 
     |   | sub_array1[2][chapter]=chapter_3, sub_array1[2][max]=60 

Quer Actual y

SELECT 
    no, name, maxcombo, exp, level, location, 
    (
    (SELECT chapter, MAX(score) as max, name 
    FROM chapter_test_progress 
    WHERE name = user.name AND type = 'vocabulary' GROUP BY chapter 
    ) 
) as user_chapter_test_statuses, 
    (
    (SELECT chapter, MAX(score) as max, name 
    FROM chapter_test_progress 
    WHERE name = user.name AND type = 'kanji' GROUP BY chapter 
    ) 
) as user_chapter_test_status_kanjis 
FROM 
    user 
ORDER by 
    exp DESC 
LIMIT $offset, $rowPerPage 

Merci,

+0

Désolé, en fait il n'y a pas de && dans la requête, c'est à dire dans le message pas dans le code ... toujours la même erreur ... :( – bbnn

+0

Pouvez-vous poster la requête réelle et la définition de table? – Konerak

+0

la requête réelle – bbnn

Répondre

0

Je ne sais pas si je comprends bien la structure de votre base de données, mais cela devrait le faire:

SELECT U.no, U.name, S.chapter, S.max 
FROM user U, 
     (SELECT CP.chapter, MAX(CP.score) max, CP.name FROM chapter_test_progress CP GROUP BY name, chapter) S 
WHERE U.name = S.name 
GROUP BY U.name, S.chapter; 

Les données de test, je l'ai utilisé :

CREATE TABLE `chapter_test_progress` (
    `chapter` varchar(255) DEFAULT NULL, 
    `score` int(11) DEFAULT NULL, 
    `name` varchar(255) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

insert into `chapter_test_progress`(`chapter`,`score`,`name`) values ('ch_1',10,'alice'),('ch_1',20,'alice'),('ch_2',10,'bob'),('ch_2',50,'bob'),('ch_1',100,'alice'),('ch_2',100,'alice'),('ch_1',200,'bob'),('ch_2',200,'bob'); 

CREATE TABLE `user` (
    `no` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`no`) 
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; 

insert into `user`(`no`,`name`) values (1,'alice'),(2,'bob'); 

Vous devez normaliser votre base de données.

+0

bonjour, merci beaucoup, mais je pense que l'ensemble de données que je vais obtenir à partir de votre requête n'est pas ce que je veux comment puis-je normaliser la base de données? Je suis un débutant :( – bbnn

+0

http: // fr .wikipedia.org/wiki/Database_normalization –

+0

Vous devriez mettre à jour votre question avec ce que vous voulez obtenir et un échantillon de vos données (quelque chose de similaire à ma réponse) .Ceci permettra aux gens de comprendre facilement quel est votre problème et d'être plus désireux d'aider toi. –

Questions connexes