2009-06-15 4 views
17

Je veux faire une requête contenant «j'aime» et «pas comme».aimer et ne pas aimer dans une requête mysql

Exemple actuel: je veux tout ce qui commence par '1 |%' mais pas avec '1 | 6 | 199 |%' ou '1 | 6 | 200 |%'.

requête actuelle:

'SELECT * FROM `links` WHERE `category` LIKE '1|%' NOT LIKE '1|6|199|%','1|6|200|%' ORDER BY `score` DESC LIMIT 9'. 

Mais cela ne fonctionne pas. Des conseils? thx

+1

"Ne fonctionne pas" devrait être un peu plus précis. Je suppose que vous obtenez une erreur de syntaxe - auquel cas Michael Haren a votre solution. –

Répondre

29

Il suffit d'ajouter « et la catégorie » ...

SELECT * FROM links 
WHERE category LIKE '1|%' 
    AND category NOT LIKE '1|6|199|%','1|6|200|%' 
ORDER BY score DESC LIMIT 9 

En fait, la condition est séparés par une virgule ne pas une syntaxe que je connais. Si ce ne fonctionne pas, essayez ceci:

SELECT * FROM links 
WHERE category LIKE '1|%' 
    AND category NOT LIKE '1|6|199|%' 
    AND category NOT LIKE '1|6|200|%' 
ORDER BY score DESC LIMIT 9 
+0

thx! ça a marché! Cependant, quel est le problème avec ce qui suit? SELECT * FROM 'links' OERE' category' LIKE '1 | 6 |%' AND 'category' PAS COMME '1 | 6 | 137 |%', '1 | 6 | 151 |%', '1 | 6 | 118 |% ',' 1 | 6 | 176 |% ',' 1 | 6 | 67 |% ',' 1 | 6 | 199 |% ',' 1 | 6 | 160 |% 'COMMANDER PAR' score' DESC LIMIT 9 ? il montre vide mais ce n'est pas thx! –

+0

Si vous devez effectuer plusieurs exclusions, je vous suggère d'utiliser SUBSTR (catégorie, 1, 8) NOT IN (1 | 6 | 137 | ',' 1 | 6 | 151 | ', ...). –

3

Vous pouvez utiliser regexps:

SELECT * 
FROM links 
WHERE category LIKE '1|%' 
     AND category NOT REGEXP '^1\\|6\\|(199|200)\\|' 
ORDER BY 
     score DESC 
LIMIT 9 

Notez que REGEXP « s ne pas utiliser les index, alors que LIKE fait.

Dans cette requête, LIKE '1|%' servira de filtre grossier en utilisant l'index sur category le cas échéant, alors que REGEXP « s raffineront filtre les résultats.

2

Je pense qu'un plus gros problème est que vous avez des tables normalisées. La bonne réponse serait de normaliser vos tables.

Mais si vous ne pouvez pas faire cela, vous devez utiliser des virgules comme séparateurs et FIND_IN_SET() à la place:

WHERE FIND_IN_SET('1', category) > 1 
    AND FIND_IN_SET('6', category) > 1 
    AND FIND_IN_SET('199', category) = 0 
    AND FIND_IN_SET('200', category) = 0 
0

Il est également possible d'utiliser deux jointure interne, sans doute pas la meilleure solution pour cette requête, mais pourrait encore être utile.

SELECT * FROM liens

INNER JOIN (SELECT * FROM liens OÙ catégorie NOT LIKE '1 | 6 | 199 |%') AS escl1 ON (links.category = escl1.category)

INNER JOIN (SELECT * FROM liens OÙ catégorie NOT LIKE '1 | 6 | 200 |%') AS escl2 ON (links.category = escl2.category)

OU catégorie LIKE '1 |%'

COMMANDER PAR score DESC LIMIT 9

Questions connexes