修改SQL以包含额外的表

时间:2012-05-19 07:08:31

标签: php mysql opencart

我如何获得横幅名称?如果您查看下面的数据库,您会看到这会带回除实际banner之外的所有内容。name

此外,我认为它应该检查是否启用了检查它的横幅状态。

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 
    ) 
)

数据库结构

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 个答案:

答案 0 :(得分: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