2017-05-09 44 views
-2

我目前正在「練習」做一個論壇。我從來沒有做過這麼大的事情,並且已經持續了一段時間。幾乎一切正常,但我無法從索引頁上的類別中選擇適當的最新主題。PHP/SQL檢索這兩個類別和最新主題

這裏是SQL:

$sql = ' 
    SELECT topic_id, topic_subject, topic_by FROM topics WHERE topic_cat IN (1,2,3) ORDER BY topic_cat DESC LIMIT 3 
    UNION 
    SELECT cat_id, cat_name, cat_description FROM categories WHERE cat_id IN (1,2,3) 
    '; 

我也會從數據庫中提供兩個表的一些照片。 這是分類表。 CATEGORIES

這是主題表。

TOPICS

這裏的基本思想,因爲你可以從SQL來講,是它選擇了三個第一類,然後選擇從這些三個類別的最新話題。

將sql檢索到的信息放入包含所有內容的表中的代碼。

$result = mysqli_query($conn, $sql); 

    if (!$result) { 
     echo 'Could not display categories. Error: ' . mysqli_error($conn); 
    } else { 
     if (mysqli_num_rows($result) == 0) { 
      echo 'No categories found in the database.'; 
     } else { 
      echo ' 
       <table> 
       <h3>Top 3 Categories</h3> 
       <tr> 
        <th>Category</th> 
        <th>Latest Topic</th> 
       </tr> 
      '; 

      while ($row = mysqli_fetch_assoc($result)) { 
       echo '<tr> 
        <td class="leftpart"> 
         <h3><a href="category.php?id=' . $row['cat_id'] . '">' . $row['cat_name'] . '</a></h3>' . $row['cat_description'] . ' 
        </td> 
        <td class="rightpart"> 
         <a href="topic.php?id=' . $row['topic_id'] . '">' . $row['topic_subject'] . '</a> 
        </td> 
       </tr> 
       '; 
      } 

      echo '</table>'; 
     } 
    } 

我不知道還有什麼要添加到這一點,所以如果有任何疑問,請評論它,我可以有回答,或主支柱添加額外的信息!

+0

也許這個問題可以幫助您:http://stackoverflow.com/questions/1442527/how-to-select-the-newest-four-items-per-c ategory –

+0

你最近的話題是什麼意思? –

回答

2

實際上您正在尋找的是JOIN,它基本上用於根據兩個或多個表之間的相關列合併行。

以下是不同類型的SQL的連接:

  • (內連接):返回兼得 表
  • LEFT(外)的匹配值的記錄聯接:返回從所有記錄左表和右表
  • RIGHT(外)的 匹配的記錄JOIN:右表中返回的所有記錄,以及左表
  • 充滿 匹配的記錄(外) JOIN:返回所有記錄時存在兩種 留下了匹配或右表

這就是你想要什麼:

SELECT 
    topics.topic_id, 
    topics.topic_subject, 
    categories.cat_id, 
    categories.cat_name, 
    categories.cat_description 
FROM 
    topics 
    JOIN 
     categories 
     ON topics.topic_cat = categories.cat_id 
ORDER BY 
    topics.topic_date DESC LIMIT 3; 

你沒有得到與工會正確的結果,原因在這裏看看:

UNION運算符用於合併兩個或多個SELECT語句的結果集。

  • 內UNION每個SELECT語句必須具有相同數目的 列
  • 的列還必須具有類似的數據類型
  • 在每個SELECT語句的列也必須按相同的順序

您的桌子不符合上述creatiria

+0

它會給三個類別或三個主題或總共三行? –

+0

總共有三行記住我們現在已將表加入到一個表中@AhmedGinani –

+0

感謝您的詳細解答,這是有效的,但如果某人在同一類別中發佈了2個主題,它顯示了同一類別中的2個主題,有沒有辦法擺脫這個?如果發生了什麼不清楚,我可以在SELECT添加DISTINCT後發送截圖 – Chaost

0

試試這個:

select * from topics inner join categories 
on topics.topic_cat = categories.cat_id 
order by topics.topic_date desc limit 3 

基本上,內部聯接將做this.You可以選擇特定領域,而不是*如果你想要的。

+0

好的,我應該在下面保留「Union select」嗎? – Chaost

+0

不,只是這個查詢。 –

+0

我可以知道爲什麼是負面嗎? –