in reply to in, ands, ors in query

It's the same as in other languages (Perl not excluded): and and or have different precedences, so you need to be explicit in the order you want:
select foo from bar where baz in (1,2,3) and ( quux = 4 or bar2 = 5 -- running out of funny names )

Replies are listed 'Best First'.
Re^2: in, ands, ors in query
by Anonymous Monk on Dec 13, 2006 at 01:34 UTC
    Hi.

    I did try to put parenthesis around the AND but now nothing is pulled back from the database. I know without a doubt that @choices containes the engine's names properly but with the parenthesis, nothing mathches. Without it, everything that has settings1-4 to "public" load.

    my $data = qq(SELECT engine, name1, name2, name3, name4, lable1, l +able2, lable3, lable4, settings1, settings2, settings3, settings4 FROM special_fields WHERE engin +e IN (".join(",",map($dbh->quote($_), @choices)).") AND settings1="public" OR settings2="public" OR settings +3="public" OR settings4="public");

      Your Perl syntax is broken. If you start a quoted string with qq(, then it won't end until the matching ), but you have a double quote followed by Perl code that you clearly expect to run (".join...). So please cut'n'paste the actual code you are using (since you say you get rows returned you must have a working query, just not quite the right query).

      - tye        

        Thanks for your help, I am still very confused and appreciate all your advice and help.

        This is the entire mysql statement that runs without error but pulls records back that it shouldn't.

        my $data = qq(SELECT engine, name1, name2, name3, name4, lable1, l +able2, lable3, lable4, settings1, settings2, settings3, settings4 FROM special_fields WHERE engin +e IN (".join(",",map($dbh->quote($_), @choices)).") AND settings1="public" OR settings2="public" OR settings +3="public" OR settings4="public"); my $sth = $dbh->prepare($data); $sth->execute() or die $dbh->errstr; my ($engine, $name1, $name2, $name3, $name4, $lable1, $lable2, $la +ble3, $lable4, $settings1, $settings2, $settings3, $settings4); $sth->bind_columns(\$engine, \$name1, \$name2, \$name3, \$name4, \ +$lable1, \$lable2, \$lable3, \$lable4, \$settings1, \$settings2, \$settings3, \$settin +gs4);
        It's long code, I apologize, there's like 12 columns in this table which makes it look messy.

        The thing really confusing me is the entire JOIN statement, it was code from a previous node on here.

        All I'm trying to do is have a variable (@choices) with a few names (engines column) and pull back only the records found in the array. That's why the join() is there and that's why I'm completely lost.

        When I wrap ( ) around AND ( ... or ... or ... ) I get 0 results back.

      As tye suggested, you need parentheses around all of the OR options too.