requête sql avec de multiples lorsque les déclarations
Je suis d'avoir un, plutôt, pour moi, compliqué de requête mysql sur laquelle je suis totalement coincé et ne peut pas trouver la réponse en ligne.
Voici ma requête:
SELECT
items.*
FROM
items
INNER JOIN
items_meta_data
WHERE
(
(meta_key = 'lat' AND meta_value >= '55')
OR
(meta_key = 'lat' AND meta_value <= '65')
)
AND
(
(meta_key = 'long' AND meta_value >= '20')
OR
(meta_key = 'long' AND meta_value <= '30')
)
GROUP BY
item_id
Bien sûr, j'ai testé la requête avec seulement 1 déclaration et qui fonctionne très bien. Donc, si je ne passe le long ou lat partie puis-je obtenir des résultats. Seulement quand j'essaie de les coudre ensemble, j'obtiens des résultats différents.
Merci pour l'aide à l'avance!
La structure de la table est comme suit:
Les éléments de tableau:
ID
item_name
item_description
Table meta:
meta_id
item_id
meta_key
meta_value
Solution
À quiconque est intéressé, j'ai enfin réussi à résoudre ce problème. Merci à vous tous pour votre aide et votre intérieur.
SELECT
SQL_CALC_FOUND_ROWS items.*
FROM
items
INNER JOIN
items_meta ON (items.ID = items_meta.post_id)
INNER JOIN
items_meta AS m1 ON (items.ID = m1.post_id)
WHERE
1=1
AND
items.post_type = 'post'
AND
(items.post_status = 'publish')
AND
( (items_meta.meta_key = 'lat' AND CAST(items_meta.meta_value AS SIGNED) BETWEEN '55' AND '65')
AND
(m1.meta_key = 'long' AND CAST(m1.meta_value AS SIGNED) BETWEEN '20' AND '30') )
GROUP BY
items.ID
ORDER BY
items.date
DESC
- Peux-tu expliquer plus précisément ce qui se passe quand vous "coudre ensemble"? Ce que les données vous interrogez ressembler et quels résultats obtenez-vous?
- Nous pouvons supposer que ce n'est pas un bug de mysql, vous devez donc vous dire ce qui vous attend, et ce que vous au contraire observé. Quelles sont les données que vous utilisez par le biais de la requête?
- Vous êtes à la recherche d'une base de données en ligne où
meta_key
est à la fois'lat'
et'long'
. Je ne suis pas sûr que ce soit possible... - Il ne se passe rien, les résultats sont vides. Aucune requête d'erreur ou rien d'autre. Aussi pas de résultats tu que je sais pour sûr qu'il existe une entrée avec les valeurs exactes comme indiqué ci-dessus... donc, il devrait au moins retourner qu'une seule ligne.
- -1 pour polémiquer sur impossible OÙ l'une des clauses
- rien n'est impossible! Je suis juste de faire une erreur que j'essaie de comprendre en demandant de l'aide.
- Veuillez fournir des précisions sur ce que vous voulez atteindre avec votre requête!
- vous avez été dit que votre OÙ se réduit à
WHERE 0=1
efficacement qui est toujours faux. C'est ce que je veux dire par impossible. Ce n'est pas un problème SQL: c'est un problème de logique... - Je n'ai encore aucune idée de pourquoi vous donner un -1 pour quelque chose comme ça... de toute façon le problème est résolu. J'ai posté la solution dans mon post original. Merci aussi pour votre aide
Vous devez vous connecter pour publier un commentaire.
Vous devez considérer que
GROUP BY
qui se passe après laWHERE
conditions de la clause ont été évalués. Et leWHERE
clause considère toujours qu'une seule ligne, ce qui signifie que dans votre requête, lemeta_key
conditions sera toujours possible de prévenir tous les enregistrements de la sélection, depuis une colonne ne peut pas avoir plusieurs valeurs pour une ligne.Et que dire de la redondante meta_value des contrôles? Si une valeur est autorisé à être à la fois plus petits et supérieures à une valeur donnée, puis de sa valeur réelle n'a pas affaire à tous - la vérification peut être omis.
Selon l'un de vos commentaires vous souhaitez vérifier les endroits moins d'une certaine distance à partir d'un emplacement donné. Pour obtenir de bons distances, vous pensez réellement avoir à utiliser une certaine forme de distance appropriée de la fonction (voir, par exemple, cette question pour plus de détails). Mais ce SQL devrait vous donner une idée de comment commencer:
Ce..
est le même que
L'ajout de l'ensemble (la même chose s'applique à la
long
filtre) vous avez cette impossible clause where qui ne donnera pas de lignes carmeta_key
ne peut pas être 2 valeurs dans une ligneVous devez consulter votre opérateur pour vous assurer d'obtenir la bonne logique
Qu'est-ce que
meta_key
? Bande toutes lesmeta_value
des conditions, réduire, et de vous retrouver avec ceci:Depuis
meta_key
ne peut jamais simultanément l'égalité de deux valeurs différentes, pas de résultats retournés.Sur la base des observations tout au long de cette question et réponses jusqu'à présent, il semble que vous êtes à la recherche de quelque chose de plus le long des lignes de cette:
Note le
OR
entre le haut niveau des conditions. C'est parce que vous voulez que les dossiers qui sontlat
oulong
, car aucun enregistrement ne sera jamaislat
etlong
.Je ne suis toujours pas sûr de ce que vous essayez d'accomplir par l'intérieur des instructions conditionnelles. Tout non-nulle valeur correspond à ces numéros. Alors peut-être que vous pouvez élaborer sur ce que vous êtes en train de faire là. Je suis également pas sûr à propos de la fin de la
GROUP BY
clause, mais qui pourraient être en dehors du contexte de cette question entièrement.AND
dans la version réduite à être unOR
? Mise à jour de la question avec la structure de la table et nous pouvons aider à créer une requête.OR
entre leslat
etlong
contrôles. Quelque chose comme:WHERE (key='lat' AND value=...) OR (key='long' AND value=...)
. Vous voulez tester lelat
etlong
individuellement et de retour tout ligne qui correspond à un, puisque pas une seule ligne ne sera jamais correspondre à la fois.OR
dans ce cas, vous aider. On dirait que vous pensez que leAND
signifie quelque chose de différent de ce qu'il fait réellement. Vous êtes en train de demander à la base de données, "Donnez-moi la lat ET les enregistrements de longs enregistrements." Ce n'est pas la façon dont le moteur de recherche fonctionne. Vous avez besoin de lui demander, "Donnez-moi tout d'enregistrement qui est un lat OU est longue." Ensuite affiner la recherche à partir de là, comme, "Donnez-moi tout d'enregistrement qui est un lat ET au sein de cette gamme, OU tout document qui est un long ET à l'intérieur de cette plage donnée." La clause where matchs ligne par ligne, il ne sait rien de conceptuel globe.Peut-on voir la structure de ta table? Si je suis à la compréhension de ce, alors l'hypothèse est faite par la requête est qu'un enregistrement peut être seulement
meta_key - 'lat'
oumeta_key = 'long'
pas les deux parce que chaque ligne a un seulmeta_key
colonne et ne peut contenir que 1 valeur correspondante, et non pas 2. Qui pourrait expliquer pourquoi vous n'obtenez pas de résultats lorsque vous vous connectez avec unAND
, c'est impossible.