Так как вы хотите «в основном все строки кроме те с, б или в», вы можете сделать использование where_not_in
директивы:
$query = $this->db
->select('*')
->from('sets')
->where_not_in('type', array('a','b','c'))
->order_by('date', 'asc');
Смотрите, например this answer (остерегаться массивы!)
Update
Просто добавить специи, вопрос о том, чтобы использовать where_in
или where_not_in
на самом деле не так просто («просто используйте тот, который будет генерировать самый короткий или простой SQL»). Если у вас большой стол и мощность комплектов, которые вы собираетесь искать, большой, и у вас есть указатель на поле, затем (в зависимости от многих факторов), делающий отрицательный поиск может быть гораздо менее эффективный, чем (по-видимому) больше положительный поиск.
Индексы хороши ищут то, что вим, а не за то, что в них не. Таким образом, вы могли бы на самом деле найти его полезным сделать:
->where_in('type', array_diff( // Where type is...
range('a', 'z'), // ...everything...
array('a','b','c') // EXCEPT a, b or c
))
// The above solution works also if you look for non-consecutive letters.
MySQL может затем сделать двадцать очень быстро поиск по индексу (d, E, F, ...), а не только три сравнит на возможно медленное полное сканирование таблицы. В зависимости от количества элементов, которые вы ищете, индексации, производительности диска, размера стола и (разве я не учитывал погоду?) Погоды, этот второй метод может быть быстрее, даже если SQL является более сложным.
Это, безусловно, стоит посмотреть, когда вы окажетесь на этапе оптимизации запросов. Не надо просто пойдите и проиндексируйте каждый столбец, как вы увидите в некоторых онлайн-так называемых учебниках - индексирование иногда может быть вредоносным для исполнений и чрезмерного определения по определению всегда есть.
Не уверен, поддерживает ли CAL DBA, но в mysql есть 'BETWEEN'. В противном случае вы можете создать его самостоятельно, используя 'IN' и' implode' результата функции 'range()' PHP. – PeeHaa