1
votes

Comment vérifier les données disponibles ou non dans les résultats?

J'ai une requête

$days='1,7';
        $result12 =$this->db->select('GROUP_CONCAT(batch_days SEPARATOR ",")')
                    ->from('batch_list')
                    ->where('batch_venue_id',$venue_id)
                    //->where('days',$days)
                    ->group_by('batch_venue_id')
                    ->get()
                    ->result();

Voici le tableau de résultats que je reçois.

Array ( [0] => stdClass Object ( [GROUP_CONCAT(batch_days SEPARATOR ", ")] => 1,2,3,4,7 ) ).

Ce que je fais maintenant, c'est. Je passe le 1,7 pour vérifier que cela est disponible ou non dans le résultat si trouvé puis affichez le message.

SELECT GROUP_CONCAT(batch_days SEPARATOR ", ") FROM `batch_list` WHERE `batch_venue_id` = '1' GROUP BY `batch_venue_id`.

Donc j'obtiens le résultat [GROUP_CONCAT (batch_days SEPARATOR ",")] => 1,2,3,4,7) maintenant je dois vérifier les $ jours disponibles ou non dans le résultat. Pourriez-vous m'aider à vérifier cela?


3 commentaires

je vous conseille de lire Pourquoi devrais-je fournir un MCVE pour ce qui me semble être une requête SQL très simple?


N'utilisez pas GROUP_CONCAT ici. Et définissez $ days comme tableau $ days = [1, 7] . Ensuite, vous pouvez utiliser array_intersect pour votre vérification.


@PaulSpiegel, pouvez-vous m'aider avec un exemple?


3 Réponses :


1
votes

Vous pouvez essayer avec explode () et array_intersect(),

SELECT GROUP_CONCAT(batch_days SEPARATOR ", ") as result FROM `batch_list` WHERE `batch_venue_id` = '1' GROUP BY `batch_venue_id`

Suggestion: Vous peut utiliser un alias lors de la sélection de colonnes dans le tableau

<?php
$day_str = '1,7';
$result_str = '1,2,3,4,7';
$result = explode(',',$result_str);
$days = explode(',',$day_str);

if(count(array_intersect($result, $days)) > 0){
    echo "$day_str are in $result_str";
}else{
    echo "$day_str are not in $result_str"; 
}
?>

DEMO: https://3v4l.org/MG5kt


13 commentaires

Donnez-moi un peu de temps pour vérifier


@ user9437856 okk, vous pouvez voir la DEMO


Ce que j'ai fait, je change une certaine valeur dans votre démo, de 1,7 à 1,5 et ça me donne la sortie 1,5 ne sont pas en 1,2,3,4,7 ......... ... Je pense que 1 est disponible mais 5 n'est pas disponible.


voulez-vous que les deux jours soient disponibles ou cela fonctionnera si un seul jour est dans le résultat?


N'importe quel jour est disponible, puis affichez le message. si j'essaye 1,4 alors disponible mais si j'essaye 1,5 alors un est disponible mais 5 pas


@ user9437856 voir à nouveau mon EDIT, remplacez simplement la ligne == count ($ days) par > 0 et faites-moi savoir est-ce que cela fonctionne avec une valeur de jours différents ou non?


J'obtiens les résultats dans [GROUP_CONCAT (batch_days SEPARATOR ",")] => 1,2,3,4,7 alors comment puis-je afficher? Je veux dire que je dois utiliser comme $ result_str = "Ce que je dois ajouter ici"


Par exemple, codeigniter.com/user_guide/database/examples.html . Vous devez utilisez $ this-db-> query pour cela s'il vous plaît voir mon post ci-dessous, vous reviendrez pour connaître et créer un alias pour ces champs


@AlwaysSunny, j'ai essayé votre code mis à jour mais cela ne fonctionne pas. Je veux dire, j'essaye encore 1,5 et cette fois, il est disponible.


@ user9437856 Je suppose que je suis un peu confus ce que vous voulez? Voici ce que vous dites sur votre msg précédent Un seul jour est disponible puis affichez le message


Oui, correct mais 5 n'est pas disponible dans la liste. J'ai encore essayé 8,1 et il est disponible


@ user9437856 pourriez-vous s'il vous plaît modifier votre question et nous montrer quelle est la sortie attendue quand elle est 1,7 ou 1,5 ou 7,7 ou toute combinaison


@AlwaysSunny, ce que je fais, c'est que j'ai un nombre de jours dans le tableau et des jours qui proviennent de la fin de l'utilisateur. À partir des jours de fin d'utilisateur, le numéro vérifiera si ce numéro est disponible ou non dans la liste. Si quelqu'un trouve quelqu'un, alors affichez le retour vrai ou faux.



0
votes

Vous devriez utiliser -> result_array (); au lieu de -> result (); car il serait traité comme un tableau normal et non comme un tableau d'objets.

Que vous pouvez utiliser in_array () , les méthodes array_search, etc. pour trouver si les éléments sont dans le tableau ou non

Ou vous pouvez utiliser la méthode find_in_set pour vérifier les valeurs sont là ou pas.

Si vous utilisez la méthode result, vous devez la récupérer comme objet à partir de la requête SQL

  foreach($result12 as $val)
    {
    $ar[]=$val;
    }

Utilisation de PHP la chaîne de variables que vous pouvez récupérer sous la forme $result12[0ITED->test;

ou en utilisant la boucle foreach

$ ar_match = [1,7]

SELECT GROUP_CONCAT(batch_days SEPARATOR ", ") as test FROM `batch_list` WHERE `batch_venue_id` = '1' GROUP BY `batch_venue_id`.

maintenant $ ar est un tableau unidimensionnel Vous pouvez utiliser array_intersect () . Vérifier si les éléments d'un tableau sont dans un autre tableau en PHP


0 commentaires

1
votes

Idéalement, vous voudrez peut-être faire cela dans du code MySQL pur.
Si vous le souhaitez, vous pouvez avec ce code MySQL.

Requête

$result12 =$this->db->select('GROUP_CONCAT(batch_days SEPARATOR ",") AS list')
                     # not sure if a second select() chain like this was allowed or not, i can't remember annymore.
                    ->select('
                        (
                           CASE 
                              WHEN (
                                  SELECT
                                    COUNT(*) AS batch_list_count
                                  FROM
                                    batch_list
                                  WHERE
                                    batch_venue_id = 1
                                  AND
                                    batch_days IN (1, 5)      
                                  ) >= 1                              
                              THEN 1
                              ELSE 0       
                            END 
                      ) AS value_exists
                   ')
                    ->from('batch_list')
                    ->where('batch_venue_id',$venue_id)
                    //->where('days',$days)
                    ->group_by('batch_venue_id')
                    ->get()
                    ->result();

if( is_array($result12) ) {
  if (isset($result12[0]) && isset($result12[0]->value_exists) && (((int)$result12[0]->value_exists) == 1)
     echo "<message>"; // display available message
  else 
     echo "<message>"; // display non available message
}

Résultat

| GROUP_CONCAT(batch_days SEPARATOR ", ") | value_exists |
| --------------------------------------- | ------------ |
| 1, 2, 3, 4, 6, 7                        | 1            |

voir démo

Pour les valeurs 1 et 7 manquantes, voici le résultat

SELECT
    GROUP_CONCAT(batch_days SEPARATOR ", ")
  , (
      CASE 
        WHEN (
           SELECT
              COUNT(*) AS batch_list_count
           FROM
             batch_list
           WHERE
             batch_venue_id = 1
           AND
             batch_days IN (1, 7)      
        ) >= 1                              
      THEN 1
      ELSE 0       
      END
    ) AS value_exists
FROM batch_list
WHERE
 batch_venue_id = 1
GROUP BY
 batch_venue_id

voir démo

Après un examen, je me suis rendu compte que ma dernière requête était trop loin d'une solution de contournement pour être confirmée avec la norme ANSI SQL GROUP BY.
La requête ci-dessous

SELECT
    GROUP_CONCAT(batch_days SEPARATOR ", ")
  , (
      CASE 
        WHEN (
           SELECT
              COUNT(*) AS batch_list_count
           FROM
             batch_list
           WHERE
             batch_venue_id = 1
           AND
             batch_days IN (1, 7)
        # match this with the batch_days IN (1, 7) above        
        ) = 2                              
      THEN 1
      ELSE 0       
      END
    )
FROM batch_list
WHERE
 batch_venue_id = 1
GROUP BY
 batch_venue_id

est confirmée avec la norme ANSI SQL GROUP BY (MySQL force cela avec sql_mode ONLY_FULL_GROUP_BY) car (SELECT 1) est un littéral Instruction / expression SQL et ne dépendant pas du jeu de résultats GROUP BY
Cela signifie que la requête peut être optimisée sans utiliser de CROSS JOIN

Query[

SELECT 
 table.column
 , (SELECT 1) # literal SQL statement/expression
FROM 
 table
GROUP BY 
 table.colum

voir démo

Modifié car off comment:

Merci pour la réponse, j'essaye comme 1,2,3,4,7 en vérifiant avec 1,5 si n'importe qui est disponible alors il devrait afficher le message.

À partir de la question, j'ai eu l'impression que la chaîne 1,5 devait être trouvée dans 1,2,3,4,7 / Mais clairement, ce n'est pas ce que vous voulez / ce dont vous avez besoin.

Cette requête donnera les bons résultats.

Requête

| GROUP_CONCAT(batch_days SEPARATOR ", ") | values_exists |
| --------------------------------------- | ------------- |
| 2, 3, 4, 5, 6                           | 0             |

Résultat

| GROUP_CONCAT(batch_days SEPARATOR ", ") | values_exists |
| --------------------------------------- | ------------- |
| 1, 2, 3, 4, 5, 6, 7                     | 1             |

voir démo

PHP devrait afficher le message, il n'a pas été programmé dans le framework codeigniter depuis un certain temps maintenant. Donc, mon code pourrait être faux.

Mais je pense que votre code doit être quelque chose comme

SELECT
    GROUP_CONCAT(batch_days SEPARATOR ", ")
  , MAX(
      CASE
        # match this with the batch_days IN (1, 7) part in the CROSS JOIN list length
        WHEN values_exist_check.batch_list_count = 2 
        THEN 1
        ELSE 0
      END
    ) AS values_exists
FROM batch_list
CROSS JOIN (
  SELECT
    COUNT(*) AS batch_list_count
  FROM
    batch_list
  WHERE
      batch_venue_id = 1
    AND
      batch_days IN (1, 7)
) AS values_exist_check
WHERE
 batch_venue_id = 1
GROUP BY
 batch_venue_id


4 commentaires

Merci pour la réponse, j'essaye comme 1,2,3,4,7 vérifiant avec 1,5 si quelqu'un est disponible alors il devrait afficher le message.


"si quelqu'un est disponible alors il devrait afficher le message" right @ user9437856 si seulement hors d'eux est disponible votre question dit autre chose ...


donne moi un peu de temps pour vérifier


Je pensais que je pouvais stocker toute la valeur dans la variable et la comparer si la correspondance était trouvée, puis elle afficherait le message ou le créerait.