[英]match multiple rows on same table MySQL
我正在使用PHP和MySQL進行多面導航。 我遇到了要使用特定過濾器獲得產品的問題。
此處的示例結構和數據: http : //sqlfiddle.com/#!9/80065/4
使用來自sqlfiddle的查詢,我會得到一個過濾器的結果就好了。
對於2個過濾器,“將”工作的“查詢”將類似於:
SELECT * FROM `attributes` WHERE ( `attribute_id` = '49' AND `text` = 'LED' ) AND ( `attribute_id` = '358' AND `text` = '1920x1080 (FullHD)' )
當然這是行不通的。
最后的查詢需要給我產品ID。 從該示例將是:37743 37697
表中大約有200,000行。
我不認為JOIN會是一個解決方案,因為它會花費很多時間,並且將用於網站的多面導航。
匹配一行不是問題,但是當我嘗試匹配同一張表中的兩行時,我無法使其工作。
該過濾器需要可用於2個以上的WHERE,搜索2個屬性僅是示例,我將需要的不止於此 。
返回的行必須包含product_id,該product_id與我的2個或更多屬性的過濾器匹配。
謝謝您的幫助!
假設過濾器屬性位於數組中,如下所示:
$attributes[] = array(
49 => 'LED',
358 => '1920x1080 (FullHD)' );
然后,制作過濾器:
$filterPieces = array();
foreach ( $attributes as $attId => $text ) {
$filterPieces[] = sprintf(
"(`attribute_id` = '%d' AND `text` = '%s')",
$attId, $text );
}
$filter = implode( ' OR ', $filterPieces );
最后是查詢
$query = "SELECT * FROM `attributes` WHERE ( $filter )";
這是在前端不使用JOIN的解決方案。
在代碼中,我為OR邏輯連接器設置了implode( ' OR ', $filterPieces )
,因為AND產生矛盾,結果集為EVER。
`attribute_id` = '49' AND `attribute_id` = '358'
沒有行可以同時滿足兩個值的條件。
我找到了一種自行解決此問題的方法。
SELECT `product_id` FROM `attributes`
WHERE ( (`attribute_id` = '49' AND `text` = 'LED')
OR
(`attribute_id` = '358' AND `text` = '1920x1080 (FullHD)') )
GROUP BY `product_id`
HAVING count(*) = 2
這將返回與我的兩個過濾器都匹配的產品的ID。
有效的sqlfiddle: http ://sqlfiddle.com/#!9/80065/35
感謝您的所有評論和答案!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.