2013-07-09 112 views
0

我有一個使用WHERE子句的查詢。使用MySQL WHERE子句

我的查詢:

SELECT * FROM notifications WHERE recipient= '".$_SESSION['id']."' AND viewed > 
'".$twoweeksago."' OR viewed IS NULL ORDER BY recieved DESC 

基本上,查詢選擇數據的所有行收件人登錄和查看用戶的日期不到兩週($ twoweeksago是一個變量集我腳本)。但是,對於觀看欄默認爲0000-00-00 00:00:00所以我只好用:

OR viewed IS NULL 

這就產生了一個問題。我認爲這是隻適用於以前的狀態的條件,那就是:

AND viewed > '".$twoweeksago."' 

但是,它實際上是整個WHERE子句和空隙以前所有條件的OR。我怎樣才能寫出一個OR條件,隻影響&查看>'「。$ twoweeksago。''

謝謝!

+2

您是否嘗試過在'views>'中添加圓括號'$ twoweeksago。「'OR查看IS NULL'? –

+1

您可以強制條件以您選擇的括號的順序進行評估 - 在本例中爲WHERE收件人... AND(查看> ...或查看IS NULL)' – andrewsi

回答

1

你應該換你的條件,在這樣的括號:

SELECT * FROM notifications WHERE recipient= '".$_SESSION['id']."' AND (viewed > '".$twoweeksago."' OR viewed IS NULL) ORDER BY recieved DESC 

這應該工作。作爲一個方面說明,你應該記住不要直接從用戶那裏使用變量,因爲它可以引入安全膛線。

0

您應該添加括號分組子句周圍:

SELECT * FROM notifications WHERE recipient= '".$_SESSION['id']."' AND (viewed > '".$twoweeksago."' OR viewed IS NULL) ORDER BY recieved DESC 
0
SELECT * FROM notifications WHERE recipient= '".$_SESSION['id']."' AND (viewed IS NULL OR viewed > '".$twoweeksago."') ORDER BY recieved DESC 

我相信會工作。

+0

就像數學或編碼一樣。括號分開處理。 – skrilled

0
SELECT * FROM notifications 
WHERE recipient= '" . $_SESSION['id'] . "' 
AND (
    viewed > '" . $twoweeksago . "' 
    OR viewed IS NULL 
) 
ORDER BY recieved DESC; 
0

試試這個

SELECT * FROM notifications WHERE recipient= '".$_SESSION['id']."' AND (viewed > 
'".$twoweeksago."' OR viewed=NULL ORDER BY recieved DESC 
0
SELECT * 
FROM table 
WHERE 
receipt = session 
HAVING 
viewed > time OR 
viewed = null 
ORDER BY 
sort DESC 

使用Pdo您的示例看起來像這樣。

$link = new PDO('mysql:host=localhost;dbname=db', 'User', 'Pass'); 
$entry = $link->prepare('SELECT * FROM table WHERE receipt = :session HAVING viewed > :time OR viewed = null ORDER BY received DESC'); 
$entry->execute(array('session' => $Session, 'time' => $Time)); 

使閱讀更容易,更不用說了。現在你擁有更少的控制能力。 :3個贏得任何人的PDO?