2011-11-19 50 views
0

此查詢輸出每個結果6次:因此,對於一列以「亞青」的主體,它會被輸出爲:亞青
亞青
亞青
亞青
阿約
亞青
SELECT查詢輸出每個單個結果六次

function get_comments($page_type, $spot) { 
     $query = mysql_query(" 
           SELECT 
           comments.user_id AS user_id, 
           comments.page_type AS page_type, 
           comments.spot AS spot, 
           comments.comment AS comment, 
           comments.timestamp AS timestamp, 
           users.first_name AS first_name, 
           users.last_name AS last_name 
           FROM comments, users 
           WHERE page_type = '$page_type' AND spot = '$spot' AND (comments.user_id = users.user_id OR comments.user_id = '0') 
           ORDER BY timestamp DESC 
          "); 

     while($fetch = mysql_fetch_assoc($query)) { 

      $comment = $fetch['comment']; 
      $timestamp = $fetch['timestamp']; 
      $timestamp_date = date('M d y\'', $timestamp); 
      $timestamp_time = date('g:m', $timestamp); 
      $comments_user_id = $fetch['user_id']; 

       if(date('H', $timestamp) > 12) { 
        $am_pm = 'pm'; 
        } else { 
         $am_pm = 'am'; 
         } 

      $first_name = $fetch['first_name']; 
      $last_name = $fetch['last_name']; 

      ?> 

      <div id="replies"> 

       <?php if($comments_user_id == '0') {echo 'Guest';} else { echo $first_name.' '.$last_name; } ?><br /> 
       <?php echo $timestamp_date; ?><br /> 
       <?php echo $comment; ?> 

      </div> 

      <?php 

      } 
     } 

在這裏$ PAGE_TYPE和$發現是指:http://localhost/ $ PAGE_TYPE/$現貨

+0

u能在你輸出的地方發佈代碼?問題可能在那裏,如果不是在數據本身 – xbonez

+1

有多少'註釋'有'user_id = 0'? –

+0

你是對的!如果user_id = 0,它會相乘。我將如何解決這個問題? – Graham

回答

2

你得到重複,因爲你的隱式連接條件包含此:

OR comments.user_id = '0' 

,你有多個行與comments.user_id = 0。這些user_id = 0行中的每一行都會顯示匹配您的連接條件,並且會導致重複。解決方案是修正您的數據,以便每條評論有一個有效的user_id,其中「有效」意味着「有一個條目users」,並且放棄comments.user_id = 0連接條件的一部分。當你在它的時候,切換到InnoDB表並添加外鍵來強制執行這個參照完整性約束。

順便說一句,如果user_id是一個整數,那麼你真的不應該引用它;你正在使數據庫做不必要的工作,並建立一個壞習慣,如果你每個人都使用另一個數據庫,會導致你一些痛苦和痛苦。你也應該切換到一個明確的加盟:

from comments join users on comments.user_id = users.id 
where page_type = '$page_type' and spot = '$spot' 
+0

我如何讓客人成爲有效的用戶。如果$ _SESSION ['user_id']未設置,則user_id設置爲0.如何更改該值? – Graham

+0

@Graham:您可以添加一個條目到ID爲零的'users'並將其用作您的訪客帳戶,然後調整登錄內容以禁止「訪客」登錄。 –

0
$query = mysql_query(" 
         SELECT 
         comments.user_id AS user_id, 
         comments.page_type AS page_type, 
         comments.spot AS spot, 
         comments.comment AS comment, 
         comments.timestamp AS timestamp, 
         users.first_name AS first_name, 
         users.last_name AS last_name 
         FROM comments, users 
         WHERE page_type = '$page_type' AND spot = '$spot' AND (comments.user_id = users.user_id OR comments.user_id = '0') 
         GROUP BY comments.user_id 
         ORDER BY timestamp DESC 
        "); 
+0

只顯示每個用戶最多一條評論。因此,它將顯示最多一個評論,並且每個獨特用戶不會超過一個評論。 – Graham

+0

把你的數據庫結構和預期的輸出..... –

0

我不像我熟悉MS T-SQL那樣熟悉MySQL。但它看起來像你正在交叉連接你的桌子。用戶和評論之間可能應該有JOIN。否則,每條評論將被加入到每個用戶。

這是一個指向MySQL中JOIN細節的鏈接。

我可能錯過這裏的語法部分的MySQL細節,我可以; t檢驗這一點,但這裏有雲:

這將返回這些記錄爲用戶提供相關的註釋:

SELECT 
    comments.user_id AS user_id, 
    comments.page_type AS page_type, 
    comments.spot AS spot, 
    comments.comment AS comment, 
    comments.timestamp AS timestamp, 
    users.first_name AS first_name, 
    users.last_name AS last_name 
FROM 
    comments INNER JOIN users 
    ON comments.user_id = users.user_id 
WHERE page_type = '$page_type' 
AND spot = '$spot' 
AND (comments.user_id = users.user_id OR comments.user_id = '0') 
ORDER BY timestamp DESC 

這將返回所有用戶的記錄,並會匹配他們存在的註釋記錄: 選擇 comments.user_id AS USER_ID, comments.page_type AS PAGE_TYPE, comments.spot AS現貨, comments.comment AS評論, comments.timestamp時間戳, users.first_name AS FIRST_NAME, users.last_name AS姓氏 FROM 評論INNER JOIN用戶 ON comments.user_id = users.user_id WHERE PAGE_TYPE = '$ PAGE_TYPE' 和現貨=「$點」 AND(comments.user_id = users.user_id OR comments.user_id = '0') ORDER BY時間戳DESC

+0

'WHERE'子句似乎照顧這一點。 – zneak

1

因爲你(comments.user_id = users.user_id OR comments.user_id = '0')條款,因爲有記錄users每一位客人的評論會出現多次。顯然,這是六個。

編輯補充:

我想你想是這樣的:

SELECT comments.user_id AS user_id, 
     comments.page_type AS page_type, 
     comments.spot AS spot, 
     comments.comment AS comment, 
     comments.timestamp AS timestamp, 
     COALESCE(users.first_name, 'Guest') AS first_name, 
     COALESCE(users.last_name, 'User') AS last_name 
    FROM comments 
    LEFT 
OUTER 
    JOIN users 
    ON users.user_id = comments.user_id 
WHERE comments.page_type = '$page_type' 
    AND comments.spot = '$spot' 
ORDER BY comments.timestamp DESC 
; 

,但我有「萬畝太短」,你應該重新評估表的設計一致。使用comments.user_id = 0來表示「客人評論」,當沒有users.user_id = 0的記錄時,不是很好,因爲它給你留下了「幾乎外鍵」的關係。完整的外鍵關係將使您的表結構更易於理解和推理。

0
while($fetch = mysql_fetch_array($query)) 

變化而語法上面

和改變這種代碼的語法

WHERE page_type = '$page_type' AND spot = '$spot' AND (comments.user_id = users.user_id OR comments.user_id = '0') 

WHERE page_type = '$page_type' AND spot = '$spot' AND (comments.user_id = users.user_id)