2012-01-08 57 views
0

我有這個查詢工作得很好,但是我想改變我的數據庫表一點,所以我需要改變我的查詢一點點。我的工作的查詢是這樣的:MYSQL從數據庫中的其他表中選擇,匹配數據等

$notificationsq = mysql_query(" 
SELECT 
    N.*, 
    P.*, 
MAX(N.date) AS newDate 


FROM 
    notifications N, 
    posts P 

WHERE 
    N.userID='$session' 
AND 
    (
      (
        N.action='1' 
       AND 
        (N.state = 0 OR N.state=1) 
      ) 
      OR 
       N.action='2' 
    ) 
AND P.state='0' 
AND 
    N.uniqueID=P.id 
GROUP BY 
    N.uniqueID 
ORDER BY 
    N.state ASC, 
    newDate DESC 

") or die(mysql_error()); 

現在,我在做什麼正在改變行「UNIQUEID」,所以我需要做的基本上是:

if(action==2){unqiqueID=C.postID} else {uniqueID=N.uniqueID} 

這裏是我的表結構: i41.tinypic.com/nyzolg.png


的信息從照片是:

Table: Notifications 

id UserID FromID UniqueID Action State Read_Date Date 
1 1  2  1   1  0  0   1325993600 
2 1  6  2   1  0  0   1325993615 
3 1  2  1   2  0  0   1325993622 
4 1  6  2   2  0  0   1325993661 
5 2  6  2   2  0  0   1325993661 

Action = 1表示UniqueID標識Posts中的一行; Action = 2表示UniqueID標識評論中的一行。

Table: Posts 

id ToID FromID Post  State Date 
1 1  2  Hey   0  1325993600 
2 1  6  okay yeah 0  1325993615 

Table: Comments 

ID PostID FromID Comment  State Date 
1 1  2  lol   0  1325993622 
2 1  6  ohh   0  1325993661 

因此,在操作爲2的通知表中,UniqueID是針對註釋表中的'id'的。 我想回的是帖子ID,所以在查詢這純粹是因爲如果是的UniqueID這個:

1 
2 
1 
1 
1 

但是,在動作爲1

回答

2

你不能在同一個SELECT語句的WHERE子句中引用計算列。通常,這可以通過使用子查詢像這樣被工作圍繞:

SELECT 
    * /* or list the necessary columns specifically */ 
FROM (
    SELECT 
    ... 
    some_expression AS columnAlias, 
    ... 
    FROM ... 
) 
WHERE ... 
    AND columnAlias = ... 

正如你所看到的,通過some_expressioncolumnAlias計算列,可以在外部選擇使用它的別名來訪問。

但是你在這裏拉了很多列,並且也使用了遮罩,所以試圖使用子查詢可能會導致名稱衝突。嘗試通過明確指定來減少要拖動的列數。


UPDATE

基於在評論進一步解釋,這裏就是我可能會做在您的情況:

SELECT 
    P.id AS uniqueID2, 
    MAX(N.Date) AS newDate, 
    MIN(state) AS state,   /* or maybe 'AS minState', if you like */ 
    MAX(N.Read_Date) AS lastRead, /* just another example to illustrate the 
             point that most columns in this query 
             should be selected with aggregating */ 
    ... /* other columns as necessary */ 
FROM notifications N 
    LEFT JOIN comments C ON N.action = 2 AND N.uniqueID = C.id 
    INNER JOIN posts P ON N.action = 1 AND P.id = N.uniqueID 
         OR N.action = 2 AND P.id = C.postID 
WHERE N.userID = '$session' 
    AND (N.action = 1 AND N.state IN (0, 1) OR N.action = 2) 
    AND P.state = 0 
GROUP BY P.id 
ORDER BY 
    state ASC, /* No 'N.' prefix here because now it is a reference 
        to the MIN(state) column, which has the same name. 
        If it looks too confusing, use a different alias for 
        the column and change this entry accordingly. */ 
    newDate DESC 
+0

謝謝,您能否使用我的代碼將某些東西放在一起以向我展示您的意思?這將是非常感謝。 – 2012-01-08 00:54:13

+0

@DylanCross:說實話,您的查詢目前對我來說沒有什麼意義。我可以看到,您正在嘗試使用'C.postID'或'N.uniqueID'來匹配'P.id',具體取決於特定條件。這是讓我最困惑的狀況。你能解釋一下你想做什麼嗎?我可能會提出一個不同的方法,但首先我想了解那裏發生了什麼。 – 2012-01-08 04:24:42

+0

好吧,N.uniqueID是以前用來存儲C.postID的地方。現在它是註釋表中註釋的唯一標識。這是一張照片。 http://i41.tinypic.com/nyzolg.png – 2012-01-08 04:34:40

0

嘗試的UniqueID將保持不變把uniqueID2 = P.id放在HAVING塊中,而不是放在WHERE塊中。我相信它會起作用。

大衛·萊昂斯, ehtu.com

+0

謝謝,這類作品,但它只是返回1結果應該至少有3個或4個。 – 2012-01-08 00:55:02

相關問題