2010-06-15 67 views
0

嗨,我爲燈具創建了一個列表。兩個表的邏輯問題

$result = mysql_query("SELECT date FROM ".TBL_FIXTURES." WHERE compname = '$comp_name' GROUP BY date"); 
    $i = 1; 
    $d = "Start"; 
    while ($row = mysql_fetch_assoc($result)) 
    { 
     $odate = $row['date']; 
     $date=date("F j Y", $row['date']); 
     echo "<p>Fixture $i - $d to $date</p>"; 
    } 

正如您從查詢中看到的那樣,日期顯示在燈具表中。 我的系統工作的方式是,當一個燈具「播放」時,它會從這個表格中刪除。因此,當整個賽程完成後,本表中不會有任何日期。他們將在另一張桌子上。

是否有無論如何我可以同時運行日期的其他查詢,並顯示只有日期從結果表中的日期如果沒有在結果表中的日期?

"SELECT * FROM ".TBL_CONF_RESULTS." 
           WHERE compid = '$_GET[id]' && type2 = '2' ORDER BY date" 

這將是第二個查詢!

編輯從這裏開始......

反正我有可以從兩個表中選擇日期,然後只使用一個,如果有匹配。然後使用日期行(GROUPED BY)來填充我的查詢?那可能嗎?

回答

2

這聽起來像你想聯盟兩個結果集,類似於如下:

SELECT f.date FROM tbl_fixtures f 
WHERE f.compname = '$comp_name' 
UNION SELECT r.date FROM tbl_conf_results r 
WHERE r.compid = '$_GET[id]' AND r.type2 = '2' 
GROUP BY date 

這應該選擇f.date和r.date添加行是不是已經在結果集(至少這是T-SQL的行爲)。顯然它可能無法很好地擴展,但有很多博客(搜索:UNION T-SQL)。

+0

就是這樣。我只是不知道聯盟!我將GROUP BY更改爲ORDER BY,因爲這是我原始查詢中的一個缺陷。謝謝這麼多老兄,真的很有幫助! – sark9012 2010-06-15 20:19:39

+0

我在想這個GROUP BY子句的奇怪之處;-) – jessicah 2010-06-17 09:13:31

1

從Notes上this page

//performs the query 
$result = mysql_query(...); 

$num_rows = mysql_num_rows($result); 

//if query result is empty, returns NULL, otherwise, 
//returns an array containing the selected fields and their values 
if($num_rows == NULL) 
{ 
    // Do the other query 
} 
else 
{ 
    // Do your stuff as now 
} 
+0

我不認爲這會工作。它會返回行,但不會有足夠的行。假設我在聯盟中有4支球隊,我有3輪球員。當第一輪的裝置離開裝置表時,那是當我需要其他查詢來填充日期。但查詢仍然會返回行,因爲第二輪和第三輪的裝置仍然存在。所以我認爲如果我檢查結果表的日期,如果有行,請將它們與夾具表進行比較。如果有兩個相同的行,則只返回一行,否則從燈具返回一行。 – sark9012 2010-06-15 18:50:50

+0

@Luke - 我必須誤解你的問題 - 但是你不能仍然使用'$ num_rows'變量嗎? – ChrisF 2010-06-15 19:19:28

+0

對不起,有時我很難解釋自己。你必須更難以​​理解我。我試着先查看結果表格,然後查看燈具表格。如果有重複,我只想使用其中的一個日期。然後我想顯示使用GROUP BY的日期。我怎樣才能做到這一點?我很困惑。 – sark9012 2010-06-15 19:23:25

1
  1. WHERE compid = '$_GET[id]'提出了SQL Injection的oportunity。
  2. TBL_FIXTURESTBL_CONF_RESULTS應該是$TBL_FIXTURES$TBL_CONF_RESULTS
+0

我想'TBL_FIXTURES'是一個'define()'或者一個'const' – gnarf 2010-06-15 18:59:27

+0

這兩個定義... – sark9012 2010-06-15 19:05:24

1

ChrisF有解決方案!

您可能會想到的另一件事是,是否有必要執行刪除並移動到另一個表。解決這種類型挑戰的常用方法是爲每條記錄添加一個狀態字段,而不僅僅是查詢所有狀態爲「x」的查詢「全部」。例如,1可能是「暫存」,2可能是「正在使用中」,3可能是「已使用」或「已歸檔」在您的示例中,而不是刪除該字段並將該記錄「移動」到另一個表必須在foreach循環中發生,你可以簡單地將狀態字段更新爲下一個狀態。

因此,您不需要額外的表格,每個記錄刪除一個額外的數據庫命中,理論上可以提高應用程序的性能。

+0

+1用於建議更好的DB設計作爲解決方案:) – gnarf 2010-06-15 19:57:28

+0

啊更好的數據庫設計可能是一個選項infact 。但是,由於以下原因,ChrisF沒有解決方案。我需要檢查兩張表中的日期。然後我可以對日期進行分組並使用它們。我怎樣才能做到這一點?我在哪裏從兩個表中取日期,如果有重複,只能使用一次? – sark9012 2010-06-15 20:02:02

1

看起來像你想要的是一個UNION查詢。

$q1 = "SELECT DISTINCT date FROM ".TBL_FIXTURES." WHERE compname = '$comp_name'"; 
$q2 = "SELECT DISTINCT date FROM ".TBL_CONF_RESULTS. 
     "WHERE compid = '$_GET[id]' && type2 = '2'"; 

$q = "($q1) UNION DISTINCT ($q2) ORDER BY date"; 
+0

這看起來像這樣也會起作用。有兩個聯盟的答案,我剛剛看到這一個。感謝您的幫助。 – sark9012 2010-06-15 20:20:39