簡體   English   中英

匹配同一張表MySQL上的多行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM