2014-10-27 15 views
2

我有這個系統可以跟蹤物品的位置。位置跟蹤系統中的單個查詢

示例表:

constb

consid cons 
    1 Nint 
    2 PS 
    3 XB 
    4 AT 

consloctb

locid consid loc 
    1  1  GS 
    2  2  IT 
    3  2  GG 
    4  1  IG 
    5  2  SS 
    6  3  SM 
    7  3  FB 
    8  1  SS 
    9  2  SM 
    10  3  IT 
    11  4  SM 

其結果將顯示所有項目的當前位置。它看起來像這樣:

Nint - SS 
PS - SM 
XB - IT 

我現在想的邏輯是做一個嵌套循環。

$res=mysqli_query($con,"SELECT * FROM constb ORDER BY id"); 

while($row=mysqli_fetch_array($res)){ 

    $consid=$row["consid"]; 

    $res2=mysqli_query($con,"SELECT * FROM consloctb WHERE consid='$consid' ORDER BY locid DESC LIMIT 1"); 

    while($row2=mysqli_fetch_array($res2)){ 

    echo $row["cons"]." - ".$row2["loc"]; 

    } /* END OF SECOND LOOP */ 

} /* END OF FIRST LOOP */ 

這將顯示我想要的結果。

如果我添加一個搜索函數,我會做同樣的嵌套循環過程,只要在第二個循環中添加另一個WHERE條件,如果搜索的位置與loc列相同。

$srchloc=$_POST["search"]; /* DATA SUBMITTED */ 

$res=mysqli_query($con,"SELECT * FROM constb ORDER BY id"); 

while($row=mysqli_fetch_array($res)){ 

    $consid=$row["consid"]; 

    $res2=mysqli_query($con,"SELECT * FROM consloctb WHERE consid='$consid' AND loc='$srchloc' ORDER BY locid DESC LIMIT 1"); 

    while($row2=mysqli_fetch_array($res2)){ 

    echo $row["cons"]." - ".$row2["loc"]; 

    } /* END OF SECOND LOOP */ 

} /* END OF FIRST LOOP */ 

實例搜索,如果用戶搜索的項目,目前在SM,結果將顯示

PS - SM 
AT - SM 

這樣做,我認爲可能會降低搜索過程中的第二個選項。我怎樣才能實現這一點使用單個查詢?或者讓這個過程更快?

+0

難道你不把它放在你的SQL查詢? – Darren 2014-10-27 02:15:00

+0

我不明白爲什麼像這樣:'SELECT * FROM constloctb AS const_loc LEFT JOIN constb ON const_loc.consid = constb.id WHERE const_loc.loc ='$ srchloc'ORDER BY const_loc.locid'不起作用。這將減少很多你必須做的處理。 (*未經測試*) – Darren 2014-10-27 02:24:51

回答

1

如果要列出所有項目的當前位置:

SELECT t.cons, 
     t.loc 
FROM 
    (SELECT constb.consid AS id, 
      constb.cons AS cons, 
      consloctb.loc AS loc 
    FROM constb 
    LEFT JOIN consloctb ON constb.consid = consloctb.consid 
    ORDER BY constb.consid, 
      consloctb.locid DESC) AS t 
GROUP BY t.id; 

如果你想過濾的搜索位置的結果,你可以添加HAVING條款:

SELECT t.cons, 
     t.loc 
FROM 
    (SELECT constb.consid AS id, 
      constb.cons AS cons, 
      consloctb.loc AS loc 
    FROM constb 
    LEFT JOIN consloctb ON constb.consid = consloctb.consid 
    ORDER BY constb.consid, 
      consloctb.locid DESC) AS t 
GROUP BY t.id HAVING t.loc='SM';