2013-10-13 2 views
0

Если вы посмотрите на следующий запрос:Как я могу упростить этот запрос?

$query = $this->db 
     ->select('*') 
     ->from('sets') 
     ->where('type', 'd') 
     ->or_where('type', 'e') 
     ->or_where('type', 'f') 
     ->or_where('type', 'g') 
     ->or_where('type', 'h') 
     ->or_where('type', 'i') 
     ->or_where('type', 'j') 
     ->or_where('type', 'k') 
     ->or_where('type', 'l') 
     ->or_where('type', 'm') 

        ... 

     ->or_where('type', 'x') 
     ->or_where('type', 'y') 
     ->or_where('type', 'z') 
     ->order_by('date', 'asc'); 

    return $query->get()->result(); 

В столбце «Тип» у меня есть «а» через «г» Bascially Я хотел бы все строки минус те, с, Ь, с. Как я могу написать это более элегантным способом?

+0

Не уверен, поддерживает ли CAL DBA, но в mysql есть 'BETWEEN'. В противном случае вы можете создать его самостоятельно, используя 'IN' и' implode' результата функции 'range()' PHP. – PeeHaa

ответ

4

Так как вы хотите «в основном все строки кроме те с, б или в», вы можете сделать использование 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 является более сложным.

Это, безусловно, стоит посмотреть, когда вы окажетесь на этапе оптимизации запросов. Не надо просто пойдите и проиндексируйте каждый столбец, как вы увидите в некоторых онлайн-так называемых учебниках - индексирование иногда может быть вредоносным для исполнений и чрезмерного определения по определению всегда есть.

+0

было бы где_ин вместо – Jonysuise

+0

да, извините, не прочитал последнее предложение. – Jonysuise

+0

+1 Вы можете использовать 'SELECT * FROM foo WHERE NOT EXISTS (SELECT 1 FROM foo WHERE type IN (a, b, c))', который инвертировал бы отрицательный поиск в положительный. – AlexP

0

сделать массив символов от d до г, как:

$chars = array('d', 'e'...., 'z'); 

Теперь используйте where_in пункт вроде этого:

$rs = $this->db->select('')->where_in('type', $chars)->get('table'); 
3

Может быть что-то вроде этого?

$query = $this->db 
     ->select('*') 
     ->from('sets') 

     ->where_in('type', range('d','z')) 

     ->order_by('date', 'asc'); 

    return $query->get()->result(); 
0
$this->db->where('type !=', 'a'); 
$this->db->where('type !=', 'b'); 
$this->db->where('type !=', 'c'); 
$this->db->order_by('date', 'asc'); 
$query = $this->db->get('sets'); 

Это должно работать.

Также обратите внимание, что при выборе всего и использовании GET нет необходимости использовать SELECT или FROM.

Смежные вопросы