0

バナー名はどのように取得しますか?以下のDBを見ると、実際のから離れたすべてのものが戻ってくることがわかりますbannername

また、確認するバナーステータスが有効になっていることを確認する必要があると思います。

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

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`)
);
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 *、代わりに、実際にフェッチする各列を明示的にリストします。

問題が発生した理由の1つは、テーブルの結合にコンマ(暗黙的な結合)を使用したbannerが、結合条件を指定しなかったことです。WHERE句に。のような条件が必要でしたb.banner_id = bi.banner_id。ただし、明示的なINNER JOIN構文を使用することをお勧めします。


このクエリでのLEFT JOIN代わりにを使用する理由がわかりません。INNER JOINこの句では、行が返されるためにテーブルでWHERE満たす必要のある条件を指定します。banner_image_descriptionそのテーブルに対応する行がない場合(これはの目的ですLEFT JOIN)、行は返されません。そこで、それらをに切り替えましたINNER JOIN

于 2012-05-21T13:29:49.420 に答える