![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
bugbug
Car ma table contenu_type_annonce champs contenu a été faite pour contenir n'importe quel type de contenu (mon site peut s'apparenter a un cms, il est adaptable a tout type de site, c'est une base commune pour les données des annonces)
Donc la colonne 'contenu' est de type VARCHAR je suppose ?
Peut-être que MySQL procède à une conversion quand il teste le BETWEEN.
Du coup, quand 'contenu' contient un nombre, il le convertit peut-être aussi et certains nombres convertis peuvent se retrouver dans la plage de dates du test.
Par exemple, convertir un entier en date peut donner une date :
SELECT CAST('19630724' AS DATE)
Résultat :
1963-07-24
Au passage, si 'contenu' est de type VARCHAR, tu devrais mettre la valeur testée entre apostrophes.
Maintenant, observons ceci :
SELECT CAST ('1963-07-24' AS UNSIGNED)
Résultat : 1963
Donc CAST(LaDate AS UNSIGNED) <> LaDate.
Alors que bien sûr CAST (L_Entier AS UNSIGNED) = L_Entier
Tu devrais donc pouvoir tester le type réel du contenu pour appliquer le bon test.
Essaie ce qui suit. Je ne suis pas sûr qu'on ait encore besoin du OR. Mais peut-être que ma syntaxe va planter lamentablement !
1 2 3 4 5 6 7 8 9 10 11 12 13
| SELECT annonce.*
FROM annonce
INNER JOIN (
SELECT annonce
FROM contenu_type_annonce
WHERE
CASE
WHEN CAST(contenu AS DATE) = contenu THEN contenu BETWEEN '1985-09-09' AND '1960-09-09'
ELSE contenu = 6
END
GROUP BY annonce
HAVING COUNT(*) > 1
) AS a ON annonce.id = a.annonce |
Partager