2012-05-19 24 views
0

如何獲取橫幅名稱?如果你看看下面的數據庫,你會發現這會帶來一切與實際banner分開。 name修改SQL以包含額外的表格

此外,我認爲它應該檢查橫幅狀態來檢查它是否啓用。

BEFORE

SELECT * 
FROM banner_image bi 
LEFT JOIN banner_image_description bid ON (bi.banner_image_id = bid.banner_image_id) 
WHERE 
    bi.banner_id = '".$banner_id."' 
    AND bid.language_id = '".$this->config->get('config_language_id')."' 

Array ( 
    [0] => Array ( 
     [banner_image_id] => 1 
     [banner_id] => 1 
     [link] => 
     [image] => data/banners/test.jpg 
     [language_id] => 1 
     [title] => Test banner 
    ) 
) 

AFTER

SELECT 
    bi.*, 
    b.name 
FROM 
    banner b, 
    banner_image bi 
LEFT JOIN banner_image_description bid ON (bi.banner_image_id = bid.banner_image_id) 
WHERE 
    b.banner_id = '".$banner_id."' 
    AND bi.banner_id = '".$banner_id."' 
    AND bid.language_id = '".$this->config->get('config_language_id')."' 

Array ( 
    [0] => Array ( 
     [banner_image_id] => 1 
     [banner_id] => 1 
     [link] => 
     [image] => data/banners/test.jpg 
     [name] => Banner heading 
    ) 
) 

DB結構

CREATE TABLE IF NOT EXISTS `banner` (
    `banner_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(64) COLLATE utf8_bin NOT NULL, 
    `status` tinyint(1) NOT NULL, 
    PRIMARY KEY (`banner_id`) 
); 

CREATE TABLE IF NOT EXISTS `banner_image` (
    `banner_image_id` int(11) NOT NULL AUTO_INCREMENT, 
    `banner_id` int(11) NOT NULL, 
    `link` varchar(255) COLLATE utf8_bin NOT NULL, 
    `image` varchar(255) COLLATE utf8_bin NOT NULL, 
    PRIMARY KEY (`banner_image_id`) 
); 

CREATE TABLE IF NOT EXISTS `banner_image_description` (
    `banner_image_id` int(11) NOT NULL, 
    `language_id` int(11) NOT NULL, 
    `banner_id` int(11) NOT NULL, 
    `title` varchar(64) COLLATE utf8_bin NOT NULL, 
    PRIMARY KEY (`banner_image_id`,`language_id`) 
); 

回答

1

我認爲這會做你想要什麼:

SELECT * 
FROM 
    banner b 
    INNER JOIN banner_image bi ON b.banner_id = bi.banner_id 
    INNER JOIN banner_image_description bid ON bi.banner_image_id = bid.banner_image_id 
WHERE 
    b.banner_id = '". $banner_id ."' 
    AND b.status = TRUE 
    AND bid.language_id = '". $this->config->get('config_language_id') ."' 

我會避免使用SELECT *,而是,明確地列出你真的想取每一列。

我認爲你遇到麻煩的一個原因是你用逗號(隱式連接)加入banner表中,但沒有指定連接條件。你需要在你的WHERE條款中需要一個條件,如b.banner_id = bi.banner_id。但是最好使用明確的INNER JOIN語法。


我沒有看到在此查詢使用LEFT JOIN,而不是一個INNER JOIN一個原因。在WHERE子句中,可以指定banner_image_description表中必須滿足的條件才能返回一行。如果該表中沒有對應的行(這是LEFT JOIN的用途),那麼將不會返回行。所以我把它們切換到INNER JOIN