Как можно выбрать определенную строку по ее номеру в наборе данных?

Как можно изменить запрос, чтобы в результаты попали только записи, где поле spw1.workers содержит значение [40], а не [170, 240], при условии выборки через LIKE '%40%'? Вот сам запрос:

```sql
(SELECT spw1.*, IF(spw1.status = 3, 5, 
	IF(spw1.status = 2, 4, IF(spw1.status = 0, 2, 0))) as al 
FROM SID_planerWork spw1
        WHERE spw1.type > 0 AND (spw1.workers LIKE '%" . $arr['workerID'] . "%'  
        or LIKE '%" . $_COOKIE['shop_id'] . "%'))
UNION ALL 
(SELECT spw2.*, 
	IF(spw2.data_close_worker = '0000-00-00' AND spw2.data_end_rec < now(), 3, 1) as al
FROM SID_planerWork spw2 where spw2.type = 0)
ORDER BY al desc;")
```
  • 19 января 2024 г. 11:17
Ответы на вопрос 2
Для выбора определенной строки по ее номеру в наборе данных, вы можете использовать оператор `LIMIT` совместно с `OFFSET`. Например, если вы хотите выбрать 5-ю строку, ваш запрос будет выглядеть так:

```sql
SELECT * FROM ваша_таблица LIMIT 1 OFFSET 4;
```

- `LIMIT 1` - указывает на то, что нужно получить только одну строку.
- `OFFSET 4` - пропускает первые четыре строки, так что возвращается пятая.

Чтобы изменить запрос таким образом, чтобы в результаты попали только записи, где поле `spw1.workers` содержит значение `[40]`, а не `[170, 240]`, вы должны быть точнее в использовании оператора `LIKE`. Вместо `%40%` используйте более специфичное сравнение.

Допустим, `workerID` и `shop_id` - числа и вы хотите удостовериться, что `workers` содержит это число как отдельное значение в списке. Вы можете использовать `CONCAT` функцию для формирования точного шаблона:

```sql
WHERE spw1.type > 0 AND (spw1.workers LIKE CONCAT('%"', $arr['workerID'], '"%')  
or spw1.workers LIKE CONCAT('%"', $_COOKIE['shop_id'], '"%'))
```

Обратите внимание: данный код подвержен SQL-инъекциям, поскольку он напрямую вставляет переменные (`$arr['workerID']` и `$_COOKIE['shop_id']`) в запрос. В production-коде вам следует использовать параметризированные запросы через `prepared statement` для защиты от таких угроз.

В зависимости от того, в каком виде хранятся данные в `workers`, вам возможно потребуется использовать другой подход, например, функции `JSON` если `workers` - это JSON-массив или регулярные выражения для более сложных случаев, однако в базовом случае - как предложено выше.
выкинуть квадратные скобочки и find_in_set() 

да и условие вида column like match1 or like match2 ЕМНИП не должны работать
Похожие вопросы