2010-11-09 2 views
0

У меня есть то, что кажется относительно простым предложением AND/OR, которое дает мне немного головную боль.SQL-запрос с логическими операторами AND/OR

$query = "SELECT stv.name,stc.tmplvarid,stc.contentid,stv.type,stv.display,stv.display_params,stc.value"; 
$query .= " FROM ".$tb1." stc LEFT JOIN ".$tb2." stv ON stv.id=stc.tmplvarid "; 
$query .= " LEFT JOIN $tb_content tb_content ON stc.contentid=tb_content.id "; 
$query .= " WHERE stv.name='".$region."' AND stc.contentid IN (".implode($cIDs,",").") "; 
$query .= " OR stv.name='".$countries."' AND stc.contentid IN (".implode($cIDs,",").") "; 
$query .= " AND tb_content.pub_date >= '$pub_date' "; 
$query .= " AND tb_content.published = 1 "; 
$query .= " ORDER BY stc.contentid ASC;"; 

мне это нужно, чтобы получить значения из обоих $region и $countries. Однако, так оно и есть, только возвращает значение $countries. Если я удалю строку с OR, она вернет значение $region, но оно не вернет оба. Что я делаю неправильно?

ответ

2

Попробуйте положить кронштейны вокруг статей по обе стороны от OR. См. Ниже:

$query = "SELECT stv.name,stc.tmplvarid,stc.contentid,stv.type,stv.display,stv.display_params,stc.value"; 
$query .= " FROM ".$tb1." stc LEFT JOIN ".$tb2." stv ON stv.id=stc.tmplvarid "; 
$query .= " LEFT JOIN $tb_content tb_content ON stc.contentid=tb_content.id "; 
$query .= " WHERE (stv.name='".$region."' AND stc.contentid IN (".implode($cIDs,",").")) "; 
$query .= " OR (stv.name='".$countries."' AND stc.contentid IN (".implode($cIDs,",").")) "; 
$query .= " AND tb_content.pub_date >= '$pub_date' "; 
$query .= " AND tb_content.published = 1 "; 
$query .= " ORDER BY stc.contentid ASC;"; 
+0

Спасибо, но это все-таки только возвращение $ страны. Вот функция в целом, если это полезно: http://pastebin.com/E4CdnQNj – Vecta

0

Похоже, что вы отсутствуете круглые скобки, нет?

А или В и С или D неоднозначна, вам нужно использовать круглые скобки, чтобы понять, вы имеете в виду (A или B) и (C или D)