Как проверить данные в наличии или нет в результатах? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть запрос

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

Это массив результатов, который я получаю.

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

Теперь я занимаюсь.Я передаю 1,7, чтобы проверить, доступен ли он или нет в результате, если найден, а затем отобразить сообщение.

$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();

Итак, я получаю результат [GROUP_CONCAT (batch_days SEPARATOR ",")] => 1,2,3,4,7) Теперь я должен проверить количество дней в наличии или нет в результате.Не могли бы вы помочь мне, как это проверить?

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Вы должны использовать ->result_array(); вместо ->result();, потому что он будет рассматриваться как обычный массив, а не массив объектов.

Чем вы можете использовать in_array(), методы array_search и т. Д., Чтобы определить, находятся ли элементы вмассив или нет

Или вы можете использовать метод find_in_set, чтобы проверить, есть значения или нет.

Если вы используете метод результата, то вам нужно извлечь его как объект из SQL-запроса

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

Используя PHP переменную строку, которую вы можете получить как $result12[0]->test;

или используя цикл foreach

$ ar_match = [1,7]

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

теперь $ ar - это одномерный массив. Вы можете использовать array_intersect () .Проверка, есть ли элементы одного массива в другом массиве в PHP

0 голосов
/ 16 февраля 2019

В идеале вы, возможно, захотите сделать это в чистом коде MySQL.Если вы хотите, вы можете с этим кодом MySQL.

Запрос

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

Результат

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

см. демо

Для пропущенных значений 1 и 7 это результат

Результат

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

см. демо

Отредактировано

После обзора я понял, что мой последний запрос был слишком сложным, чтобы его можно было подтвердить стандартом ANSI SQL GROUP BY.Запрос ниже

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

подтверждается стандартом ANSI SQL GROUP BY (MySQL форсирует это с помощью sql_mode ONLY_FULL_GROUP_BY), потому что (SELECT 1) является буквальным оператором / выражением SQL и не зависит от результирующего набора GROUP BYЭто означает, что запрос можно оптимизировать без использования CROSS JOIN

Query

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

см. demo

Отредактировано, посколькуoff comment:

Спасибо за ответ, я пытаюсь как 1,2,3,4,7 проверить с 1,5, если кто-нибудь доступен, то это 'должно отобразить сообщение.

Из вопроса у меня сложилось впечатление, что строка 1,5 должна быть полностью найдена в 1,2,3,4,7 / Но ясно, что это не то, что вы хотите / нужно.

Этот запрос даст правильные результаты.

Запрос

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

Результат

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

смотри demo

PHP должно отображать сообщение, оно уже давно не программируется в рамках codeigniter.Поэтому мой код может быть неправильным.

Но я считаю, что ваш код должен быть примерно таким:

$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
}
0 голосов
/ 16 февраля 2019

Вы можете попробовать с explode() и array_intersect(),

<?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"; 
}
?>

Предложение: Вы можете использовать псевдоним при выборе столбцов из таблицы

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

ДЕМО: https://3v4l.org/MG5kt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...