2010-09-21 4 views
0

J'ai deux tables:erreur Mysql 1111 dans une version de requête et d'erreur 1054 dans un autre

  • livres: [isbn, BOOK_TITLE, éditeur, ...]
  • inventaire: [isbn, date, num_changed]

Je veux retourner les titres de livres pour ceux qui sont en stock. J'ai essayé une jointure (requête 1) et ai obtenu l'erreur 1054, puis j'ai substitué la référence avec la valeur littérale et maintenant j'obtiens l'erreur 1111.

requête 1:

SELECT `books`.`isbn`, `books`.`book_title`, SUM(`inventory`.`numbers_changed`) AS `num` 
FROM `books` 
INNER JOIN `inventory` ON `books`.`isbn` = `inventory`.`isbn` 
WHERE `books`.`publisher` LIKE '%pint%' 
AND `num` > '0' 

requête 2:

SELECT `books`.`isbn`, `books`.`book_title`, SUM(`inventory`.`numbers_changed`) 
FROM `books` 
INNER JOIN `inventory` ON `books`.`isbn` = `inventory`.`isbn` 
WHERE `books`.`publisher` LIKE '%print%' 
AND SUM(`inventory`.`numbers_changed`) > '0' 

Quelle est la requête correcte à utiliser?

Modifier
Voici les créer des requêtes de table:

CREATE TABLE IF NOT EXISTS `books` (
    `isbn` varchar(30) CHARACTER SET ascii NOT NULL, 
    `book_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL, 
    `date_published` varchar(10) CHARACTER SET ascii NOT NULL, 
    `author` varchar(40) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL, 
    `translator` varchar(40) CHARACTER SET utf8 COLLATE utf8_persian_ci DEFAULT NULL, 
    `publisher` varchar(50) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL, 
    `ganre` varchar(50) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL, 
    `price` int(7) unsigned NOT NULL, 
    `cover_pic` int(1) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`isbn`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `inventory` (
    `isbn` varchar(30) CHARACTER SET ascii NOT NULL, 
    `date` varchar(10) CHARACTER SET ascii NOT NULL, 
    `numbers_changed` int(5) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Répondre

1

L'erreur 1054 est sur le point faisant référence à une colonne qui n'existe pas. Le message d'erreur réel aiderait à savoir ce qui cause le problème.

L'erreur 1111 est parce que vous essayez d'utiliser la fonction globale (dans ce cas, SUM) dans la clause WHERE:

WHERE ... 
    AND SUM(`inventory`.`numbers_changed`) > '0' 
    ^
     |__ see this? 

... en dehors d'une sous-requête. Les instructions SQL sont vérifiées de bas en haut, donc je pense que la suppression de SUM dans la clause WHERE montrera que l'erreur 1054 n'est toujours pas adressée.

+0

Ainsi, dans le cadre ci-dessus, si vous voulez obtenir des titres de livres avec un stock compte supérieur à 0, ce qui devrait vous faire? –

+0

@Majid: Je dois commencer par mettre à jour la question avec les instructions CREATE TABLE pour les tables 'BOOKS' et' INVENTORY'. –

1

utilisation ayant pour la deuxième où l'argument

WHERE `books`.`publisher` LIKE '%print%' 
HAVING (COUNT(`inventory`.`numbers_changed`) > '0') 

au lieu de

WHERE `books`.`publisher` LIKE '%print%' 
AND SUM(`inventory`.`numbers_changed`) > '0' 
Questions connexes