2014-09-02 30 views
0

我們有一個遺留表Prop,根據value的符號將告訴是否引用PropLongPropShort表。要清除Prop.value > 0是否需要PropShort否則PropLong需要幫助建立MySQL查詢 - 動態數據

現在我想建立一個基於最終值的動態查詢。我不知道如何做到這一點。我已經有一個查詢(隨意對這個太評論),將拉動最終值回(到str_value,但我不知道如何修改它,這樣我可以進一步延長str_value我的查詢。

SELECT *, 
    IFNULL(PropShort.str, PropLong.str) AS str_value FROM Prop 
    LEFT JOIN PropShort ON sid=Prop.value 
    LEFT JOIN PropLong ON lid=-Prop.value 

現在在哪裏呢WHERE PropShort.str=%s OR PropLong.str=%s來到這個?我特別關注在多箇中用OR查詢(即WHERE PropShort.str=%s OR PropLong.str=%s OR behavior="foo"

表定義

CREATE TABLE `Prop` (
    `propId` int(10) unsigned NOT NULL, 
    `value` int(11) NOT NULL, 
    `behavior` varbinary(255) NOT NULL, 
    KEY `propId` (`propId`), 
) ENGINE=InnoDB; 

CREATE TABLE `PropLong` (
    `lid` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `str` blob NOT NULL, 
    PRIMARY KEY (`lid`) 
) ENGINE=InnoDB; 

CREATE TABLE `PropShort` (
    `sid` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `str` varbinary(255) NOT NULL, 
    PRIMARY KEY (`sid`) 
) ENGINE=InnoDB; 

回答

1

這要看...但可能是

SELECT *, 
     IFNULL(PropShort.str, PropLong.str) AS str_value 
    FROM 
     Prop 
     LEFT JOIN PropShort 
      ON sid=Prop.value 
      AND PropShort.str=%s 
     LEFT JOIN PropLong 
      ON lid=-Prop.value 
      AND PropLong.str=%s 

現在這仍然會保持您的「Prop」表爲主,但只會根據它們各自的條件加入到各自的其他表中。因此,您可以通過ID獲得PropShort,但不匹配.str,但有一個有效的PropLONG與ID匹配,並具有正確的.str以獲取您要查找的內容。

+0

這將工作,如果唯一的約束是這樣的。不幸的是,它不是。我會在我的文章中澄清這一點。 – rh0dium 2014-09-03 03:52:28

+0

@ rh0dium,所以......你首先考慮的是(道具短/長有%s)或者(道具可以行爲='foo'),那麼抓住所有符合條件的記錄?完全不同,並顯示一些樣本數據爲這個和未來將有助於澄清這一點。 – DRapp 2014-09-03 10:20:17

+0

否 - 道具短/長是次要考慮因素。非常感謝你指出的問題正在幫助我。我還沒到那裏,但我知道你要去哪裏 – rh0dium 2014-09-03 14:04:52