2015-04-17 48 views
0

我有一個商店項目和itemgroups。CAS中的奇怪行爲在子查詢中存在時(MySQL 5.5)

我還得到了一些額外的項目,從中應該隨機選擇一個項目,以便在購物車概覽中將其展示出來,如果該項目沒有在購物車中顯示。

也可以將項目鏈接到項目組。如果沒有鏈接到我想他們中的一個在車中的商品項目,這不是媒體鏈接裏面的車是隨機選擇的

我救item2item內表項之間的關係:

itemid INT 
additional_item_id INT 

我保存表組和項目之間的關係group2item

groupid INT 
additional_item_id INT 

要讓它多了幾分簡單,讓我們假設我表看起來像這樣:

itemid INT 
name VARCHAR(100) 

這裏是我試圖獲得一個額外的項目:

SELECT 
    name 
FROM 
    items a 
WHERE 
    (a.itemid) = (
      # if we have any additional items linked to the item get one of em randomly, that is not inside of a cart 
      SELECT 
       CASE WHEN EXISTS (
            SELECT 
             b.additional_item_id 
            FROM 
             item2item b 
            WHERE 
             b.additional_item_id NOT IN (10) 
             AND b.itemid IN (10) 
           ) 
         THEN (
           SELECT 
             c.additional_item_id 
            FROM 
             item2item c 
            WHERE 
             c.additional_item_id NOT IN (10) 
             AND b.itemid IN (10) 
            ORDER BY 
             RAND() 
            LIMIT 1 
         # else if we have additional items linked to the items group get one of em randomly, that is not inside of a cart 
         ) ELSE (
            (
             SELECT 
              d.additional_item_id 
             FROM 
              group2item d 
             WHERE 
              d.additional_item_id NOT IN (10) 
             AND 
              d.groupid IN (1) 
             ORDER BY RAND() 
             LIMIT 1 
            ) 
         ) 
        END as selecteditemid 
      ) 

任何人都可以向我解釋,爲什麼我得到不同數量的行與此?

回答

0

你在問爲什麼你可能得到不同數量的行。這裏有一些想法:

  • items.itemid是不唯一的,所以重複來自多個匹配。
  • 執行else子句,where子句過濾掉所有行。
  • 執行else子句,並且group2item.additional_item_iditems.itemid匹配。

我推測,有可能是執行在case語句中的第一個條件時,該數據可能會在whenthen之間切換。

如果您正在尋找修復方法,請將子查詢移至from子句,並在where中放置更簡單的邏輯。

+0

items.itemid是主鍵。 我已經在滿足指定值的item2item和group2item中都有條目。 雖然測試我的SQL我實際工作與靜態值,仍然得到不同數量的值... 你可以舉一個例子如何使用從子句內的子查詢? 非常感謝您的努力! –

+0

btw。 (a.itemid)=(subquery)< - 這個子查詢總是產生一個id –