2010-06-01 3 views
0
SELECT * 
FROM `seriallog` WHERE `lastevent` IN 
(SELECT GROUP_CONCAT(CONCAT(' \'', `eventid`, '\'')) 
     FROM `permissions` WHERE `permissions`.`userpkid` = 1) 
+2

Qu'attendez-vous pour obtenir? Qu'est-ce que vous obtenez réellement? –

Répondre

3

Vous tentez probablement de comparer un int (lastevent) à une chaîne concaténée (le résultat de votre sous-requête).

Il est difficile de dire sans plus d'information, mais probablement ce que vous voulez faire:

select * 
from seriallog sl 
inner join permissions p on sl.lastevent = p.eventid 
where p.userpkid = 1 
+0

Pourrait écrire la première ligne comme suit: 'SELECT sl. *' – Sonny

2

La façon dont vous l'avez écrit, la requête interne retourne une chaîne comme "1, 2, 3" si seulement lignes dans seriallog avec une colonne lastevent de "1, 2, 3" correspondra exactement.

Vous êtes probablement intéressé par faire correspondre n'importe quelle ligne dont la valeur est dans un ensemble. C'est ce que SQL est conçu pour faire; vous n'avez pas besoin d'appliquer une ingénierie spéciale. Ce qui suit travaillerait:

SELECT * 
FROM seriallog WHERE lastevent IN 
(SELECT eventid FROM permissions WHERE permissions.userpkid = 1) 

Cependant, il serait préférable de la place écrire:

SELECT * 
FROM seriallog 
WHERE EXISTS (SELECT 1 FROM permissions WHERE eventid = seriallog.lastevent AND permissions.userpkid = 1) 

Cela permet à MySQL de traiter la requête plus comme une jointure, et probablement exécuter plus efficacement.

0

C'est le format le plus optimisé pour MySQL. En général, MySQL n'aime pas les sous-requêtes.

SELECT * DE seriallog sl joindre les autorisations p = sur sl.lastevent p.eventid OÙ permissions.userpkid = 1

Questions connexes