2013-02-19 48 views
0

連接表我有這個疑問在MySQL查詢,而不是多個查詢的

$query = "SELECT * FROM items WHERE itemStatus = '1' AND itemAdded > '$timestamp'"; 

一旦該查詢返回的結果我遍歷結果

結果陣列的itemid,itemLocationID,categoryParentID,的categoryID, ITEMNAME,itemDetails

在循環然後我用同一個類中調用函數運行其他三個查詢

$locationName = $this->getLocationByName($locationID); 
$categoryParentName = $this->getCategoryByName($categoryParentID); 
$categoryName = $this->getCategoryByName($categoryID); 

函數getLocationByName執行此查詢;

$q = mysql_query("SELECT * FROM locations WHERE locationID = '$locationID'"); 

此返回locationID,LOCATIONNAME的陣列,locationLink

功能getCategoryByName執行該查詢;

$q = mysql_query("SELECT * FROM categories WHERE categoryID = '$categoryID'"); 

這個返回的categoryID,類別名稱的數組,categoryLink

可能有人請幫我優化這個查詢,並可能加入他們的行列,以節省做這麼多的疑問。

在此先感謝。

林現在使用此查詢

$q = mysql_query("SELECT 
i.itemID, 
i.locationID, 
i.categoryParentID, 
i.categoryID, 
i.itemName, 
i.itemDetails, 
l.*, 
c.*   

FROM 物品i 內上i.locationID = l.locationID 內部聯接類別C於i.categoryID = c.categoryID WHERE itemStatus加入位置升= '1' AND itemAdded> '$時間戳'「)或死亡(mysql_error());

,其結果是

Array 

( [ITEMID] => 81300 [locationID] => 17 [categoryParentID] => 21 [的categoryID] => 183 [ITEMNAME] =>嗒嗒 [itemDetails] =>嗒嗒 [LOCATIONNAME ] =>輝煌,它按照預期拉動該地點。 [locationLink] =>等等 [categoryName] =>輝煌它按預期拉入類別。 [categoryLink] =>等等 )

[categoryName] => //these are missing for categoryParentID 
[categoryLink] => //these are missing for categoryParentID 
+0

你可以發佈你的表結構嗎?看起來你只需要使用JOINS。 – sgeddes 2013-02-19 16:00:52

回答

0

除非我缺少明顯的東西,我可能會建議這樣的事情作爲第一啓動:

select * 
    from items i 
    join locations l 
    on i.location_id=l.location_id 
    join categories c 
    on i.category_id=c.category_id 
where item_status='1' 
    and itemAdded > '$timestamp' 
1

我想應該是類似的東西以下查詢。我不知道你在哪裏使用$ categoryParentName。

使用您的查詢和數據:

SELECT * FROM items WHERE itemStatus = '1' AND itemAdded > '$timestamp' 
SELECT * FROM locations WHERE locationID = '$locationID' 
SELECT * FROM categories WHERE categoryID = '$categoryID' 

$locationName = $this->getLocationByName($locationID); 
$categoryParentName = $this->getCategoryByName($categoryParentID); 
$categoryName = $this->getCategoryByName($categoryID); 

請讓我知道如果返回預期的結果集。希望這會使用categoryParentID幫助

SELECT 
    it.itemID, it.itemLocationID, it.categoryParentID, it.categoryID, it.itemName, it.itemDetails, 
    l.locationID, l.locationName, l.locationLink, 
    c.categoryID, c.categoryName, c.categoryLink 
FROM items it 
LEFT JOIN locations l ON l.locationID = it.itemLocationID 
LEFT JOIN categories c ON c.categoryID = it.categoryID 
WHERE 
    it.itemStatus = '1' 
    AND it.itemAdded > '$timestamp' 

更新查詢 - 我不是說是有效的,但你可以測試,並根據需要優化。

一種選擇是更新上面的查詢 - 不知道,將工作 - 使用和大型結果集或效率不高:

LEFT JOIN categories c ON (c.categoryID = it.categoryID OR c.categoryID = it.categoryParentID) 

,我看到的是拿到2分結果集的另一種選擇(見下面) - 一個用於categId = categId,另一個用於categId = categParentId,並將結果集合在一個大的結果集中。

SELECT 
    t.itemID, t.itemLocationID, t.categoryParentID, t.categoryID, t.itemName, t.itemDetails, 
    l.locationID, l.locationName, l.locationLink, 
    t.categoryID, t.categoryName, t.categoryLink 
FROM 
(
SELECT 
    it.itemID, it.itemLocationID, it.categoryParentID, it.categoryID, it.itemName, it.itemDetails, 
    c.categoryID, c.categoryName, c.categoryLink 
FROM items it 
INNER JOIN categories c ON c.categoryID = it.categoryID 
WHERE 
    it.itemStatus = '1' 
    AND it.itemAdded > '$timestamp' 

UNION -- [ALL] 

SELECT 
    it.itemID, it.itemLocationID, it.categoryParentID, it.categoryID, it.itemName, it.itemDetails, 
    c.categoryID, c.categoryName, c.categoryLink 
FROM items it 
INNER JOIN categories c ON c.categoryID = it.categoryParentID 
WHERE 
    it.itemStatus = '1' AND 
    it.itemAdded > '$timestamp' 
) AS t 
LEFT JOIN locations l ON l.locationID = t.itemLocationID 

其他的想法 - 不進行測試,並假設ID是INT - 將不得不強制轉換爲字符串/字符。有幾個選項可以讓你編寫這個查詢 - 如果你發佈一個結構表和一些虛擬數據,我肯定有人會創建一個demo/sqlfiddle。

SELECT 
    it.itemID, it.itemLocationID, it.categoryParentID, it.categoryID, it.itemName, it.itemDetails, 
    l.locationID, l.locationName, l.locationLink, 
    c.categoryID, c.categoryName, c.categoryLink 
FROM items it 
LEFT JOIN locations l ON l.locationID = it.itemLocationID 
WHERE 
    it.itemStatus = '1' 
    AND it.itemAdded > '$timestamp' 
    AND c.category ID IN (SELECT GROUP_CONCAT(categs) FROM (SELECT CONCAT(categoryID, ",", categoryParentID) AS categs FROM items)) 
+0

我認爲問題在於查詢類別爲父類和類別的同一張表。 – 2013-02-19 16:40:56

+0

,你想要兩個結果集?即gell所有項爲categories.categoryID = items.categoryID和categories.categoryID = $ categoryParentID? – 2013-02-19 16:49:29

+0

是的,如果可以的話,謝謝你的幫助。 – 2013-02-19 16:52:04

1

我不會使用* SELECT語句 查詢與聯接可能是

SELECT 
    i.itemID, 
    i.itemLocationID, 
    i.categoryParentID, 
    i.categoryID, 
    i.itemName, 
    i.itemDetails, 
    l.*, 
    c.*   
FROM 
    items i 
    inner join locations l on i.itemLocationID = l.locationID 
    inner join categories c on i.categoryID = c.categoryID 
WHERE 
    itemStatus = '1' 
    AND itemAdded > '$timestamp' 

我希望對您有用。 乾杯!

+0

感謝您的答覆,大加讚賞,但是,我現在遇到的問題是categoryParentID是overwritter通過的categoryID結果陣列中,因爲它們都返回相同的領域。 – 2013-02-19 16:21:41

+0

陣列 ( [ITEMID] => 81300 [locationID] => 17 [categoryParentID] => 21 [的categoryID] => 183 [ITEMNAME] =>嗒嗒 [itemDetails] =>嗒嗒 [LOCATIONNAME] =>輝煌它拉在預期的位置。 [locationLink] =>嗒嗒 [類別名稱] =>輝煌它拉在類別如預期。 [categoryLink] =>嗒嗒 ) [類別名稱] =>//這些缺少categoryParentID [categoryLink] => //這些對於categoryParentID缺少 – 2013-02-19 16:27:27