SQL-запрос с логическими операторами AND / OR - PullRequest
0 голосов
/ 09 ноября 2010

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

$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 ]

2 голосов
/ 09 ноября 2010

Попробуйте поставить скобки вокруг пунктов по обе стороны от 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 голосов
/ 09 ноября 2010

Похоже, вам не хватает скобок, нет?

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

...