В идеале вы, возможно, захотите сделать это в чистом коде 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
}