2011-09-09 63 views
0

我討厭提交一個新的問題,但其他人都有一些不同的東西可以讓這個問題看起來有必要。使用PHP,如何在這三個表中查詢這個mySQL數據庫?

用戶需要輸入供應商名稱,然後在列表中查看他們從該公司購買的所有「種類」,然後按最低庫存量進行排序。

總結: 我有三個表。
有比這些更多的領域,但這些是相關的(據我所知)。

stuff_table
stuff_vendor_name *(搜索用$ USER_INPUT這一領域,但每個lookup_type結果只有一個)*
lookup_type

lookup_table
lookup_type
lookup_quantity (爲了本)
category_type

category_table
category_type
category_location(檢查該字段== $ this_location,這已分配)

Wordier說明: 的用戶正在搜索僅包含在stuff_table值 - 每個lookup_type的distinct stuff_vendor_name值。每個物品都可以從多個來源購買,其想法是查看是否有供應商曾經銷售過任何類型的物品。

但結果需要在lookup_table中的lookup_quantity ORDER BY。

重要的是,我必須檢查他們是否正在搜索正確的位置這些類別,位於category_location字段的category_table中。

如何有效地進行此查詢?
上面我提到了我擁有的變量: $ user_input(我們在stuff_vendor_name字段中搜索不同匹配的值)和$ current_location。

要理解這些表的關係,我將使用一個示例。 stuff_table將有幾十個供應商的條目,但有一個lookup_type,比如「西瓜」,「蘋果」或「櫻桃」。 lookup_table將給出「Jellybean」的category_type。一個類別類型可以有多個lookup_types。但是每個lookup_type只有一個category_type。

+0

http://www.brainbell.com/tutors/php/php_mysql/Joins_with_More_than_Two_Tables.html 我會盡快發佈此作爲我自己的答案。我不知道爲什麼這不是更廣泛的討論。 –

+0

這是一個'INNER JOIN',如果你的表至少包含一個參考記錄,那麼它將起作用,否則'LEFT JOIN'將完成這項工作。 – Shef

回答

0

我做了一個嵌套查詢來代替。

最終的代碼如下所示:

$query_row=mysql_query(
"SELECT DISTINCT * FROM table_a WHERE 
field_1 IN (SELECT field_1 FROM table_b WHERE field_2 = $field_2) 
AND field_3 IN (SELECT field_3 FROM table_c WHERE field_4 = $field_4) 
ORDER BY field_5 DESC 
"); 

這是令人難以置信的簡單。我只是不知道你可以做這樣的嵌套查詢。

我讀它是「壞形式」,因爲它使某種搜索優化不如它可能是,所以要小心使用嵌套選擇語句。

但對我來說,它似乎實際上要快得多。

0

你不分享不多的關係,但試試這個:

SELECT * 
    FROM stuff_table st 
LEFT JOIN lookup_table lt 
     ON st.lookup_type = lt.lookup_type 
LEFT JOIN category_table ct 
     ON lt.category_type = ct.category_type 
     AND ct.category_location = $this_location 
GROUP BY st.lookup_type 
ORDER BY lt.lookup_quantity 
    WHERE st.stuff_vendor_name = $user_input 
+0

category_type具有多個lookup_types。 lookup_type總是隻有一個category_type。 一個例子是,查找類型可能是橙色,草莓或蘋果,但這三個lookup_types都有一個category_type爲「jellybean」。 –

+0

@Jerry Rowe:'category_type'沒有'lookup_types'嗎?一個'lookup_type'可以有'category_type'嗎? – Shef

+0

是的,category_type可以是空的,因此沒有lookup_types,但在這種情況下不會被搜索。 但是每一個lookup_type都有一個category_type –

0

從第一眼它,你可以使用外鍵在你的表,使它們之間的連接或使用LEFT JOIN mysql命令抽象另一個鏈接表。

我能想到的唯一例子是一個學說的模式,但我認爲你會得到我在說什麼:

$q = Doctrine_Query::create() 
->from('Default_Model_DbTable_StuffTable s') 
->leftJoin('s.LookupTable l') 
->leftJoin('s.CategoryTable c') 
->orderBy('l.lookup_quantity DESC'); 
$stuff= $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY); 
相關問題