2013-12-08 42 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