2013-12-08 43 views
-1

我正在查詢整個表單其中元素的類型在選擇中被選中。Mysql WHERE子句等於所有元素

我的查詢是這樣的:

SELECT * from table WHERE element = $selection. 

現在,在選擇的選項之一是顯示所有。我怎樣才能做一個查詢,如:

SELECT * from table WHERE element = ALL? 

我知道我可以驗證它,並使用不同的查詢爲每個個案,

元素選擇:

SELECT * from table WHERE element = $selection 

如果$selection == 'all'然後使用:

SELECT * from table 

但這是隻是一個例子,在我的情況下,我將不得不做太多查詢,我可以做,但我想事先檢查,如果我只能使用ONE查詢兩種情況。

這是我的代碼:

function displayElements($sec,$ele,$from,$to){ // sec and ele could be set to 'ALL' 
    mysql_connect("#", "#", "#") or die(mysql_error()); 
    mysql_select_db("#") or die(mysql_error()); 
    mysql_query("SET NAMES 'utf8'");  
    //queries 
    if($ele == 'Box'){ 
     $resultado = mysql_query("SELECT * FROM elementos WHERE seccion = '$sec' AND elemento LIKE '%Box:%' AND fecha BETWEEN '$from' AND '$to' ORDER BY fecha ASC"); 
    } 
    else{ 
     $resultado = mysql_query("SELECT * FROM elementos WHERE seccion = '$sec' AND elemento = '$ele' AND fecha BETWEEN '$from' AND '$to' ORDER BY fecha ASC"); 
    } 

    if (!$resultado) { 
     echo "No se pudo ejecutar con exito la consulta ($sql) en la BD: " . mysql_error(); 
    exit; 
    } 

    if (mysql_num_rows($resultado) == 0) { 
     echo "nada para mostrar."; 
    exit; 
    }..blablabla 

謝謝!

+0

什麼是輸入表以及如何期望的結果表看起來像(不是所有的20.000 DATAS,而是一個例子)) – helle

+0

剛剛離開'where'?或者在('...','...')中使用'where元素,如果語句是自動生成的 – halfbit

回答

0

如果你想獲得所有剛剛做SELECT * from table

表的元素,而任何WHERE ...

+0

我知道,但是我希望只有一個查詢適用於這兩種情況,當選擇特定元素並且所有元素選擇 – gepex

+0

請更新您的文章,並提供我們的輸入和所需的輸出表... – helle

1

爲什麼要用兩個查詢(僞代碼下面可以幫助)?

q = "select * from table"; 
q += (a == "ALL") ? "" : " where element in..."; 
+0

沒錯。爲什麼即使有'WHERE'如果你想要所有的行? –

0

我寧願在您的案例中使用兩個不同的查詢。但是當有,說,5個選擇框,每個可能含有特定字符串,或「沒有選擇」的情況下,我開始喜歡

select * from table where 1=1 

「語法糖」的聲明之後,每個選擇框中,我添加了一個像

and columnX = 'valuex' 

的聲明。無論如何,優化器會拋棄1 = 1,這爲檢查添加約束條件時是否必須使用「where」或「and」節省了一些麻煩。

警告:在現實生活環境中使用此代碼可以將您的代碼打開到SQL注入。你真正應該做的,除非你正在學習,就是添加

and columnX = ? 

到查詢字符串,追加valuex到一個數組,然後使用該數組當你開始選擇綁定變量。

0

如果你能element領域本身傳遞到您的查詢,然後

WHEN element = element

不會過濾掉任何東西,除了NULL S,但任何平等檢查無論如何都會過濾掉NULL值,因爲NULL不等於NULL

+0

,使用時很有效: WHEN element = $ element(和$ element ='element') 但是查詢是WHEN element ='$ element'(引號使它成爲無效的解決方案,並且在刪除引號時正常的查詢結果是錯誤的) – gepex

+0

如果您使用'LIKE',而不是使用通配符來獲取全部數據。 –

0

,你可以把一個SELECT到你那裏:

select * from seldat,mydat where element=(
    select 
     case 
     when query_element='ALL' then element 
     else query_element 
     end 

    )  

SQL Fiddle for use without 'like'

編輯學術只使用

create table mydat (
     field1 varchar(128), 
     element varchar(128) 
    ); 

    create table seldat (
     query_element varchar(128) 
    ); 

    insert into mydat values 
     ('field A', 'basic element'), 
     ('field B', 'cpp element'), 
     ('filed C', 'cpp file'), 
     (null,null) 
    ; 


    insert into seldat values 
     ('ALL'), 
     ('basic element'), 
     ('cpp%'), 
     ('cpp element'), 
     ('cpp file') 

那麼下面的SQL工作:

select * from seldat,mydat where element in (
     select 
     case 
      when query_element='ALL' then element 
      else query_element 
      end 
     union 
     select element from mydat 
      where element like query_element 
    ) 

Full featured variant with like