2009-11-03 87 views
0

解決 - 見下面多對多表和查詢與陣列相同的變量

BISH我有複選框全部傾倒到$ fruitid []的列表,和許多一對多表1:

BoxID FruitID 
01  01 
01  02 
02  01 
02  03 
02  04 
03  02 
etc.  etc. 

我希望用戶以檢查框旁邊,他們希望每一個水果,然後查詢拉起包含所有的水果中選擇的每個盒子的名單(和其它水果是好的,這不是一個確切的內容搜索的最低要求)。

PHP工作很好,但我堅持我認爲將是一個簡單的MySQL的字符串不解。基本上如果我

SELECT boxid FROM table1 WHERE fruitid=$fruitid1 AND fruitid=$fruitid2 AND etc. 

直到所有檢查的數據輸入我最終沒有結果,因爲沒有單行包含多個fruitid。這是有道理的嗎?

我能想到的唯一的解決辦法是一堆嵌套的SELECT語句,每一個從以前的子集縮小結果池中,直到你尋找原始數組中所有的值。這似乎是CPU密集型和繁瑣的代碼。

有沒有更好的方法?

+0

Grumdrig首先發布(48秒),然後進行編輯以包含我的答案。使用OR或IN會給你相同的結果。但這聽起來像是你在尋找不同的東西。 – NitroxDM 2009-11-03 06:00:53

+0

@NitroxDM此致,而我是編輯出現。無意刷卡;這是對你的讚賞。 – Grumdrig 2009-11-03 15:26:52

+0

@Grumdrig不用擔心。 ;) – NitroxDM 2009-11-03 16:57:52

回答

1

大廈,你應該能夠得到你只需增加GROUP BY和HAVING子句找什麼:

SELECT boxid FROM table1 WHERE fruitid IN ($fruitid1, $fruitid2, ...) GROUP BY boxid HAVING COUNT(*) = $selectedFruitCount; 

通過由boxid分組並添加COUNT(),你會得到,每一個盒中包含「有趣」水果的數量。如果該計數等於所選果實的總數,那麼該框必須包含每個所選果實(可能還有更多)。請記住,這假定boxid和fruitid的組合是獨一無二的。

+0

我只是在散步,認爲納入某種計數會過濾出包含少於所有所需水果的回收箱,但不確定如何對其進行編碼。這看起來像是我的不潔思緒的乾淨實施,我會盡快嘗試。謝謝,我會讓你知道! – Drew 2009-11-03 06:21:06

+0

我無法在phpMyAdmin SQL框中工作,我不斷收到錯誤信息,但我相當有信心,我可以將其作爲一個兩步過程來完成(#1 - select _ from _ where _ in _ // #2計數過濾器)在PHP中。 不幸的是,我今晚不能嘗試它,直到我回到家。我會告訴你。 – Drew 2009-11-03 06:45:17

+0

允許HAVING子句爲您執行步驟#2中的過濾將會很好。在沒有看到您遇到的錯誤的情況下,我無法提供很多建議,除了檢查您正在運行的版本的SELECT語法的MySQL文檔。我確實運行了一個在4.1.22上運行良好的快速測試。 – bish 2009-11-03 08:00:54

1

如果您改變了與門來的OR我想你會做你想要做的事。從概念上講,閱讀選擇爲「既property1和property2並選擇行......」,而不是「選擇與property1行還與property2行,等等。」

編輯:更緊湊,你可以使用

SELECT boxid FROM table1 WHERE fruitid IN ($fruitid1,$fruitid2,...) 
+0

不錯的例子! ;) – NitroxDM 2009-11-03 04:10:12

+0

請參閱在原來的問題更多的數據 – Drew 2009-11-03 05:13:43

1

你可能要重新考慮你的數據庫(或我不知道你正試圖什麼)。但是從SQL你張貼看起來,你可以做這樣的事情:當前建議

SELECT boxid FROM table1 WHERE fruitid in ($fruitid1,$fruitid2); 
+0

請參閱另外的數據在原來的問題 – Drew 2009-11-03 05:10:36

+0

@Andrew希思 - 你能提供你想要的東西更多一些例子嗎?如果表格有兩列(BoxID,FruitID),並且具有您在上面發佈的數據,則$ fruitid1 = 01和$ fruitid2 = 02。然後,您將返回三行。 BoxID - 01 02 03 – NitroxDM 2009-11-03 05:57:33

+0

我想要的查詢不會返回BoxIDs 2和3,因爲它們都不具有這兩個值。它不是__或__搜索,它是___ AND ___查詢,這是一個棘手的部分。 – Drew 2009-11-03 06:38:31

1
SELECT boxid FROM table1 
WHERE fruitid IN ($fruitid1, $fruitid2,) 

你可以給你更多的解釋你想要什麼。從你的問題,我明白我認爲這應該工作。