簡體   English   中英

實現此SQL查詢的最佳方法是什么?

[英]What is the best way to implement this SQL query?

我有一個PRODUCTS表,每個產品可以有多個屬性,所以我有一個ATTRIBUTES表,另一個位於中間的表稱為ATTRIBPRODUCTS 屬性被分組為類別(類型,品牌,材料,顏色等),因此人們可能需要來自某個品牌的特定類型的產品。

PRODUCTS
product_id
product_name

ATTRIBUTES
attribute_id
attribute_name
attribute_class

ATTRIBPRODUCTS
attribute_id
product_id

當某人正在尋找產品時,他們可以選擇一個或多個屬性。 我遇到的問題是返回具有多個屬性的單個產品。 我知道這應該真的很簡單,但是SQL確實不是我的事,超過一定程度后,我在邏輯上會有點迷失。 問題是我試圖分別檢查每個屬性類,所以我想得到類似以下的結果:

SELECT DISTINCT products.product_id
FROM         attribproducts 
INNER JOIN products ON attribproducts.product_id = products.product_id
WHERE     (attribproducts.attribute_id IN (9,10,11)
AND        attribproducts.attribute_id IN (60,61))

我使用IN來分隔不同類的屬性塊,因此最終得到的是某些類型的產品,也包括某些品牌的產品。 從我得到的結果來看,似乎是IN語句之間的AND導致了問題。

有人可以幫忙嗎? 不幸的是,我沒有完全重構數據庫的奢侈,除此以外,它還有很多其他功能,因此,將不勝感激地接受任何有關如何使用我所擁有的建議。

看一下問題SQL:多對多表AND查詢的答案。 這是完全相同的問題。 Cletus提供了2種可能的解決方案,但都不是很瑣碎的(但是再說一次,根本就沒有瑣碎的解決方案)。

SELECT DISTINCT products.product_id 
FROM products p
INNER JOIN attribproducts ptype on p.product_id = ptype.product_id
INNER JOIN attribproducts pbrand on p.product_id = pbrand.product_id 
WHERE ptype.attribute_id IN (9,10,11) 
    AND pbrand.attribute_id IN (60,61)

嘗試這個:

select * from products p, attribproducts a1, attribproducts a2
  where p.product_id = a1.product_id
    and p.product_id = a2.product_id
    and a1.attribute_id in (9,10,11)
    and a2.attribute_id in (60,61);

這將不返回任何行,因為您只計算具有(9、10、11)和(60、61)的數字的行。

因為這些集合不相交,所以您將不會獲得任何行。

如果改用OR,它將為產品提供9、10、11、60、61集的屬性,這也不是您想要的,盡管您隨后將為每個產品獲得多行。

您可以將該select用作GROUP BY語句中的子查詢,根據產品數量進行分組,並根據共享屬性的數量對分組進行排序。 那將首先給您最高的比賽。

另外(如另一個答案所示),您可以為每個屬性集加入表的新副本,從而僅給您匹配所有屬性集的那些產品。

聽起來您有一個很好的數據模式,可以存儲,但是選擇/報告時卻很糟糕。 當您具有OBJECT,ATTRIBUTE,OBJECT-ATTRIBUTE和OBJECT-ATTRIBUTE-VALUE的數據結構時,可以存儲許多對象,每個對象具有許多不同的屬性。 有時稱為“垂直存儲”。

但是,當您要檢索具有所有屬性值的對象列表時,必須進行可變數量的聯接。 水平存儲時檢索數據要容易得多(定義的數據列)

我已經多次遇到這種情況。 由於您無法更改現有數據結構。 我的建議是在表的頂部寫一個“層”。 為您擁有的每個對象/產品動態創建一個表。 然后在這些新表中為每個屬性動態創建靜態列。 您幾乎需要將垂直存儲的屬性/值“展平”到靜態列中。 從垂直架構轉換為水平架構。

使用“展平”表進行報告,並使用垂直表進行存儲。

如果您需要示例代碼或更詳細的信息,請問我。

我希望這很清楚。 我還沒喝咖啡:)

謝謝-馬克

您可以使用多個內部聯接-我認為這可以工作:

select distinct product_id
from products p
inner join attribproducts a1 on a1.product_id=p.product_id
inner join attribproducts a2 on a1.product_id=p.product_id
where a1.attribute_id in (9,10,11) 
  and a2.attribute_id in (60,61)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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