0

我将如何获得横幅名称?如果您查看下面的 DB,您会发现这会带回除实际banner. name?

另外我认为它应该检查横幅状态以检查它是否已启用。

之前

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

之后

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`)
);
4

1 回答 1

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语法。


我看不出在此查询中使用 aLEFT JOIN而不是 an的原因。INNER JOINWHERE子句中,您指定表中必须满足的条件banner_image_description才能返回行。如果该表中没有对应的行(这是 a 的目的LEFT JOIN),则不会返回任何行。所以我将它们切换到INNER JOIN.

于 2012-05-21T13:29:49.420 回答