2014-09-30 69 views
0

我還需要從xcart_extra_field_values WHERE fieldid = 5中選擇值。從環顧四周,看起來我需要做的是使用連接和別名,但是我似乎無法弄清楚如何連接該表本身,並使用另一個別名的價值,並試圖拉同一個表兩次崩潰我的數據庫。兩次。選擇相同的列兩次

這是我當前的查詢,其工作原理:

      SELECT a.avail, 
           c.value, 
           b.productid, 
           a.productcode, 
         FROM xcart_products a, 
           xcart_products_lng_en b, 
           xcart_extra_field_values c, 
         WHERE a.productid IN 
          (SELECT productid 
           FROM xcart_extra_field_values 
           WHERE a.productid = productid 
           AND fieldid = 5 
           AND (LOWER(value) = 'retail' 
            OR LOWER(value) = 'stock' 
            OR LOWER(value) = 'c1 stock' 
            OR LOWER(value) = 'c2 stock' 
            OR LOWER(value) = 'g stock')) 
          AND c.fieldid = 9 
          AND (a.productid = b.productid) 
          AND (b.productid = c.productid) 

這是一個崩潰的數據庫查詢:

      SELECT a.avail, 
           c.value, 
           d.value, 
           b.productid, 
           a.productcode 
         FROM xcart_products a, 
           xcart_products_lng_en b, 
           xcart_extra_field_values c, 
           xcart_extra_field_values d 
         WHERE a.productid IN 
          (SELECT productid 
           FROM xcart_extra_field_values 
           WHERE a.productid = productid 
           AND fieldid = 5 
           AND (LOWER(value) = 'retail' 
            OR LOWER(value) = 'stock' 
            OR LOWER(value) = 'c1 stock' 
            OR LOWER(value) = 'c2 stock' 
            OR LOWER(value) = 'g stock')) 
          AND c.fieldid = 9 
          AND d.fieldid = 5 
          AND (a.productid = b.productid) 
          AND (b.productid = c.productid) 
+1

這是不明確的,是查詢工作還是你的嘗試? – Mihai 2014-09-30 21:11:41

+0

您是否嚴格需要使用LOWER()?它會渲染任何無用的索引,並可能減慢查詢速度。除非二進制字符串'='不管怎樣都是不區分大小寫的。 – Arth 2014-09-30 21:25:38

+0

@Mhai;通過包含與代碼不同的代碼,我已經使問題更加清楚了,該代碼不在 @Arth;是。員工手動輸入庫存地點,因此它可能是G庫存,零售,庫存,庫存,零售等。 – 2014-09-30 21:38:34

回答

0

我找到了現在的工作。典型的當我發佈MySQL的問題。

      SELECT a.avail, 
            c.value, 
            d.value, 
            b.productid, 
            a.productcode 
          FROM xcart_products a, 
            xcart_products_lng_en b, 
            xcart_extra_field_values c, 
            xcart_extra_field_values d 
          WHERE a.productid IN 
           (SELECT productid 
            FROM xcart_extra_field_values 
            WHERE a.productid = productid 
            AND fieldid = 5 
            AND (LOWER(value) = 'retail' 
             OR LOWER(value) = 'stock' 
             OR LOWER(value) = 'c1 stock' 
             OR LOWER(value) = 'c2 stock' 
             OR LOWER(value) = 'g stock')) 
           AND c.fieldid = 9 
           AND d.fieldid = 5 
           AND (a.productid = b.productid) 
           AND (b.productid = c.productid) 
           AND (c.productid = d.productid) 

我還需要比較c.productid和d.productid。但是,我對自己的答案並不滿意,因爲它看起來非常低效。不幸的是,這是由於我對mysql的理解有限。

2

這是我怎麼會寫:

SELECT xp.avail, 
     xpe5.value, 
     xpe9.value, 
     xpl.productid, 
     xp.productcode 
    FROM xcart_products xp 
    JOIN xcart_products_lng_en xpl 
    ON xpl.productid = xp.productid 
    JOIN xcart_extra_field_values xpe5 
    ON xpe5.productid = xp.productid 
    AND xpe5.fieldid = 5 
    AND xpe5.value IN ('retail','stock','c1 stock','c2 stock','g stock') 
    JOIN xcart_extra_field_values xpe9 
    ON xpe9.productid = xp.productid 
    AND xpe9.fieldid = 9 

假設你有其他所有指標的地方,你的xpe5值檢查大概是什麼讓面朝下。

我絕不會讓員工從文本框輸入一個固定的庫存位置到數據庫..至少應該有一組數值的下拉列表(也許讓員工爲新庫存位置添加值)。我可能會把股票位置選項放在一個單獨的表中,並在主表中放入一個外鍵。

+0

嗯,它的工作,它比我自己的查詢快一點,但我不確定是否因爲你刪除了LOWER函數。 該查詢比較小,但是由於有四個不同的別名,這個查詢有點混亂。但它有效,所以我會將其標記爲有用。 – 2014-09-30 21:40:44

+0

@MartynShutt高興地幫助..但混淆?!我使用了表名,而不是a,b,c,d。我也使用顯式連接將所有條件很好地分組,而不是隱式連接,這是社區大多數人已經轉向的,因爲它們很難閱讀,並且容易出現用戶錯誤(不要挖掘你)。 – Arth 2014-09-30 21:45:08

+0

我只是指你的命名約定,xp,xpl,xpe5,xpe9。我想我並不需要擔心他們叫什麼。對我來說,這看起來有點奇怪。正如我所說我對MySQL的知識是有限的,而且我知道我正在使用過時的做法,但是我正在嘗試完成一個項目,所以無論現在做什麼,都會在MySQL改進之前完成這項工作。 – 2014-10-03 10:16:10