左连接3个表并在空单元格上显示正确或错误

时间:2010-03-18 02:02:15

标签: php sql database codeigniter

好的,这可能令人困惑,所以我希望我能正确解释。

我有4张桌子:

业务 相片 视频 类

我想在主页(或其他地方)显示“精选”商家,我想根据是否有该商家的照片或视频在表格行中显示“是”或“否”。

示例:Joes Crab Shack没有视频或照片,但有特色。因此,当他的行被回显时,它将显示商家名称和业主,但是在照片或视频单元格中将没有数据,因此在视频和照片列中它将说明否。否则,如果相反的情况是真的,那么会说是的。

Here's my pastebin

6 个答案:

答案 0 :(得分:1)

你可以用这样的东西作弊:

SELECT b.[other stuff],
(SELECT COUNT(1) FROM photos WHERE busid = b.id) AS photo_count,
(SELECT COUNT(1) FROM videos WHERE busid = b.id) AS video_count
FROM business AS b [etc]

photo_count& video_count将返回0或大于0 - 很容易在PHP中获得no / yes。这也可以阻止每个企业拥有超过1张照片/视频所带来的重复结果。

警告!:将其转换为您正在使用的ORM ......我不确定ORM是否合适。但如果它不是在from()&中的“AS”别名上咆哮join(),也许你可以毫无问题地隐藏select()中的子查询。

答案 1 :(得分:0)

我要去捅这个。

我要做的是,在生成用于显示“特色”商家的表格时,我会调用您的数据库,这通常是在生成照片和视频类别时检查并检查输出的。如果有什么东西那么它就说是,如果数据库的返回为空,那么可以安全地假设没有任何照片或视频,因此你可以打印出一个号码。

答案 2 :(得分:0)

我将在这里假设您的照片和视频表包含每个商家超过1条记录,“一对多”关系。

在这种情况下,您需要重新考虑您的方法或至少对数据库结果进行一些格式化。目前,如果Joes crab shack有超过1个视频和/或照片,那么Joes crab shack将会有多个结果。

如果您需要照片/视频结果,可以在收到结果时格式化结果,以创建一个多维数组/对象,其中$featured['videos']$featured['photos]将包含您的联接结果,如果格式化的数组不包含“视频”键,因此您没有视频结果。

如果你需要知道的是它是否返回超过0行,那么在模型中创建两个新方法来计算属于特定业务的视频和照片。现在,如果方法返回超过0行或者否则返回“否”,这只是回音“是”的问题。

编辑:模型功能应该看起来像这样

function frontPageList() {
    $this->db->select('b.busname, b.busowner, b.webaddress');
    $this->db->select('(SELECT COUNT(1) FROM photos WHERE busid = b.id) AS photo_count', FALSE);
    $this->db->select('(SELECT COUNT(1) FROM videos WHERE busid = b.id) AS video_count', FALSE);
    $this->db->from ('business AS b');
    $this->db->where('featured', '1');
    return $this->db->get();
}

答案 3 :(得分:0)

我假设这些表的设置方式如下:

  1. 商业信息
  2. 照片


  3. 您将为每个业务创建一个唯一的ID(自动增量很好地工作),并且每当为业务上传照片或视频时,该记录将被插入到附加了该ID的相应表中(ID列或其他)

    每个表都允许多个业务条目(Dyllon指出“一对多”)。

    因此,无论何时显示特色商家,您都会使用唯一ID对视频和照片表进行查询,并查找返回的行。行=是,行=否。

    一个问题: 您是要将图像存储在数据库或文件名中并将它们上载到目录中吗?

    我将添加到上述建议中的唯一其他输入是构造表,以便表本身中永远不会有任何空值,这可能是因为您已经为此项目提供了四个表。 / p>

    我是第二个通过返回数据存储和排序的多维数组/对象方法。

    一个不错的选择是使用PHP图像功能来调整作为照片缩略图返回的第一个图像的大小 - 你也可以为每个视频捕捉一个帧 - 所以不是是或否,我们看起来像缩略图对于两者或'无图像/视频'slug。

    不多,但是我的$ .02。

答案 4 :(得分:0)

SELECT b.busname
     , b.busowner
     , b.webaddress
     , IF (EXISTS (SELECT 1 FROM photos p WHERE p.busid = b.id), 'Yes', 'No') has_photo
     , IF (EXISTS (SELECT 1 FROM video  v WHERE v.busid = b.id), 'Yes', 'No') has_video
  FROM business b
 WHERE b.featured = 1

答案 5 :(得分:0)

好的,这是我根据你们的建议解决问题的方法:

<强>型号:

function frontPageList() {
    $this->db->select('b.busname, b.busowner, b.webaddress, p.photoname, v.title');
    $this->db->from ('business AS b');
    $this->db->where('featured', '1');
    $this->db->join('photos AS p', 'p.busid = b.id', 'left');
    $this->db->join('video AS v', 'v.busid = b.id', 'left');
    return $this->db->get();

}

<强>控制:

function index()
    {
        $this->load->model('Business_model');
        $data['featured']   = $this->Business_model->frontPageList();
        $data['user_id']    = $this->tank_auth->get_user_id();
        $data['username']   = $this->tank_auth->get_username();
        $data['page_title'] = 'Welcome To Jerome - Largest Ghost Town in America';
        $data['page'] = 'welcome_message'; // pass the actual view to use as a parameter
        $this->load->view('container',$data);
    }

查看:

<table id="businessTable">
    <thead><tr><th>Business Name</th><th>Business Owner</th><th>Web</th><th>Photos</th><th>Videos</th></tr></thead>
        <?php foreach ($featured->result() as $row): ?>
            <tr>
                <td><?=$row->busname?></td>
                <td><?=$row->busowner?></td>
                <td><a href="<?=$row->webaddress?>">Visit Site</a></td>
                <td>
                    <?php if(isset($row->photoname)):?>
                    no
                    <?php else:?>
                    yes
                    <?php endif?>

                </td>

                <td>
                    <?php if(isset($row->title)):?>
                    no
                    <?php else:?>
                    yes
                    <?php endif?>


                </td>
            </tr>
        <?php endforeach; ?>

</table>