0
votes

Comment filtrer une colonne par deux et conditions?

la question a été résolue. Mais si vous avez une "meilleure" ou une autre façon de le faire, n'hésitez pas à ajouter un commentaire! Merci tout pour la lecture! :) strong>

J'essaie de faire une requête dynamique. Tout fonctionne parfaitement sauf une chose. J'ai Google'd pour des jours, mais je ne peux pas comprendre comment je peux faire le travail suivant; p> xxx pré>

La requête exécute mais ne renvoie rien. Le problème est que le SDG.ID ne peut pas être vrai pour: SDG_1 et: SDG_2. P>

Utilisation de l'opérateur ou de l'opérateur, mais cela ne le renvoie pas comme je le souhaite. Il doit "agir" comme opérateur. (: SDG_1 &: SDG_2 sont les noms des variables PHP qui se lient aux paramètres de l'instruction SQL.) P>

la requête doit filtrer pour les deux valeurs. Les valeurs données à: SDG_1 et: SDG_2 doivent tous deux exister dans la colonne SDG.ID de la table Project_SDG. Si la valeur de: sdg_1 existe, mais: SDG_2 non, la requête ne doit rien renvoyer. Em> stry> p>

J'ai trouvé cela sur Stackoverflow, mais cela n'a pas fonctionné pour moi: Sélection avec plusieurs conditions de la même colonne P> J'espère que quelqu'un peut m'aider à sortir. p>

EDIT: EXEMPLE REPRODUCIBLE MINIMAL FORT> P>

Query: P>

+------------+--------+
| project.id | SDG.id |
+------------+--------+
|          1 |      1 |
|          1 |      2 |
|          1 |      3 |
+------------+--------+


2 commentaires

Stackoverflow.com/help/minimal-reproductible-example - Veuillez afficher votre structure de table et vos enregistrements.


Correct. Un seul champ dans une rangée de table ne peut avoir plus d'une valeur. Habituellement, ces types de questions veulent quelque chose comme "les rangées de tableaux qui ont des lignes de table avec chaque valeur fournie", mais cela conduit à la question dans ce cas de laquelle "B lignes" doit être utilisée pour les valeurs de la clause Select.


3 Réponses :


0
votes

Pourriez-vous fournir un exemple de reproductible minimal pour votre requête?
De manière générale, un champ ne peut pas être égal à deux valeurs différentes dans le même temps. Ainsi, vous avez mélangé les opérateurs logiques ou vous avez besoin de deux champs différents.

Je peux supposer que dans votre cas, il peut y avoir plusieurs enregistrements connexes avec différentes valeurs. Dans ce cas, vous devez rejoindre la même table deux fois avec différents alias em>. Disons comme sdg1 code> et sdg2 code>. Après cela, vous pouvez comparer P>

... WHERE id IN ( subquery here )


3 commentaires

J'ai mis à jour ma question avec plus d'informations. Les tables de jonction à plusieurs reprises ne sont pas vraiment réalisables. Je ne peux pas créer 17 tables séparées pour 17 ODD. (Désolé pour la confusion, il y a plus de 2, 17 au total)


@May Merci de la mise à jour. Je vais mettre à jour ma réponse en conséquence.


Je vois, merci pour votre réponse. Votre violon semble fonctionner bien! Mais lorsque j'essaie d'ajouter tout après la «clause WHERE», je reçois un message d'erreur n ° 1055. Je pense que votre solution est meilleure que l'autre mais je ne peux pas sembler comprendre pourquoi cela ne fonctionnera pas encore avec ma propre requête. Je dois faire des recherches sur les colonnes n ° 1055 et non agrandies avant que je puisse mettre en œuvre la vôtre dans ma propre requête. Merci pour ton aide! J'apprécie vraiment tous les problèmes que vous avez suivis! :)



0
votes

Vous voulez pour chaque project.id valeurs : sdg_1 et : sdg_2 pour exister pour sdg.id , utilisez-le donc dans le clause: xxx


3 commentaires

Oui tu as raison. "Les deux valeurs ou plus". Cela dépend de ce que l'utilisateur sélectionne. Dans mon exemple, j'ai utilisé: SDG_1 et SDG_2 Mais il varie de 1 à 17. J'ai essayé cette requête, mais cela ne renvoie rien. (J'ai essayé exactement la même chose avant de poster) J'ai remplacé les variables PHP (: SDG_1 &: SDG_2) avec (1, 2) ces valeurs existent dans la colonne, mais je ne récupère pas.


La sous-requête après le retour Tout le projet.Id pour laquelle il existe à la fois des valeurs: SDG_1 et: SDG_2. J'ai essayé de le simplifier sans aucune jointure, alors j'ai utilisé uniquement la table Project_sdg qui contient la colonne Project_id et la colonne SDG_ID.


Je m'excuse. Vous avez ma gratitude! Ça marche! Mais vous m'avez donné un temps de faire de la dynamique de la requête. J'espérais qu'il y aurait une solution plus "élégante". Mais si cela fonctionne, alors ça marche! Merci encore! Je peux comprendre le reste d'ici.



0
votes

J'ai déjà répondu ici, mais j'ai une autre approchoch.

1. Trouvez des fichiers d'identifiants assocités avec un projet h2>

pour rechercher des ID de projet, nous pouvons tester table de pivot solitaire sans aucune jointure em>: p> xxx pre>

Cela nous donne la liste des identifiants de projet P>

2. Accédez à tous les champs de projets et ajoutez des conditions supplémentaires h2> xxx pré>

vous pouvez jouer avec ici ici: https://www.db-fiddle.com/f/pixe3zcs75mq2pycypk913/3 P>

3. Préparer la requête sur le côté PHP h2>

Je vais utiliser Technique connue pour préparer la déclaration SQL. P >

$ids = [1, 2, 6]; // it can come from request parameters
$text1 = 'project';
$text2 = 'sit';
// build ?,?,?,... pattern
$qmarks = implode(',', array_fill(0, count($ids), '?'));
// Use SQL query above
$sth = $dbh->prepare("
SELECT project.*
FROM project
JOIN (
  SELECT project_id FROM project_SDG
  WHERE SDG_id IN({$qmarks})
  GROUP BY project_id HAVING COUNT(*) = ?
) AS ids ON ids.project_id = project.id
WHERE
  MATCH(project.name) AGAINST (?) AND
  MATCH(project.description) AGAINST (?)
");
$sth->execute(array_merge($ids, [count($ids), $text1, $text2]));
$records = $sth->fetchAll();


0 commentaires