Слева объединить 3 таблицы и показать истинные или ложные на пустых ячейках - PullRequest
1 голос
/ 18 марта 2010

Хорошо, это может сбить с толку, поэтому я надеюсь, что объясню правильно.

У меня есть 4 таблицы:

бизнес фото видео категория

Я хочу отобразить «избранные» компании на домашней странице (или в другом месте) и хочу показать «Да» или «Нет» в строке таблицы в зависимости от того, есть ли фото или видео для этой компании.

Пример: Joes Crab Shack не имеет видео или фотографий, но присутствует. Таким образом, когда его строка выводится на экран, он отображает название компании и владельца бизнеса, но в фото или видеоэлементах не будет данных, поэтому в столбце видео и фото будет указано «Нет». сказал бы Да.

Вот мой пастин

Ответы [ 6 ]

1 голос
/ 18 марта 2010

Вы можете немного обмануть что-то вроде этого:

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. Это также предотвратит дублирование результатов, если вы получите более 1 фото / видео на компанию.

Предостережение! : преобразование этого в ORM, который вы используете ... Я не уверен, что ORM будет в порядке с этим. Но если он не лает по псевдонимам "AS" в from() & join(), возможно, вы можете без проблем прокрасться подзапросами в select().

0 голосов
/ 19 марта 2010

Хорошо, вот что я смог сделать, чтобы решить проблему, основываясь на ваших предложениях, ребята:

Модель:

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>
0 голосов
/ 18 марта 2010
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
0 голосов
/ 18 марта 2010

Я предполагаю, что таблицы настроены примерно так:

  1. Бизнес-информация
  2. Фотографии
  3. Видео
  4. ?

Вы должны создать уникальный идентификатор для каждого бизнеса (автоинкремент работает хорошо) и всякий раз, когда фото или видео загружаются для бизнеса, запись которого будет вставлена ​​всоответствующие таблицы с этим прикрепленным идентификатором (столбец идентификатора или любой другой).

В каждой таблице будет разрешено несколько записей для бизнеса («один ко многим», как отметил Диллон).

Итаквсякий раз, когда вы показываете показанную компанию, вы выполняете запрос к таблицам видео и фотографий, используя уникальный идентификатор, и ищите возвращаемые строки.Строки = да,! Строки = нет.

Один вопрос: вы собираетесь хранить изображения в базе данных или именах файлов и загружать их в каталог?

Единственный другой вход, которыйЯ хотел бы добавить к вышеупомянутым рекомендациям структурирование ваших таблиц таким образом, чтобы в самих таблицах никогда не было нулевых значений, что может иметь место, поскольку у вас уже есть четыре таблицы для этого проекта.

Я второйМетод многомерного массива / объекта для хранения и сортировки возвращаемых данных.

Приятно было бы использовать функции изображений PHP для изменения размера первого изображения, возвращаемого в качестве эскиза для фотографий - вы также можете пойматькадр для каждого видео, так что вместо «да» или «нет» мы будем показывать миниатюры для обоих или «нет изображений / видео».

Не много, но мои $ .02.

0 голосов
/ 18 марта 2010

Я собираюсь предположить, что ваши таблицы фотографий и видео содержат более 1 записи на одну компанию, отношение «один ко многим».

В этом случае вам понадобится переосмыслить свой подход или хотя бы выполнить некоторое форматирование результатов вашей базы данных. В настоящее время, если в Jock Crab Shack более 1 видео и / или фотографий, у вас будет несколько результатов для Joes Crab Shack.

Если вам нужны результаты для фото / видео, вы можете отформатировать результаты так, как вы их получаете сейчас, чтобы создать многомерный массив / объект, где $featured['videos'] или $featured['photos] будут содержать результаты вашего объединения, если ваш отформатированный массив не не содержит ключ 'videos', тогда у вас нет результатов для видео.

Если все, что вам нужно знать, это возвращение более 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();
}
0 голосов
/ 18 марта 2010

Я собираюсь нанести удар в этом.

Что я хотел бы сделать, так это то, что при создании таблицы для отображения «избранных» предприятий я бы звонил в вашу базу данных, которая обычно создавалась при создании категорий фотографий и видео, и проверял вывод. Если там что-то есть, пусть это скажет «да», если возвращение из базы данных равно нулю, это безопасное предположение, что нет никаких фотографий или видео, и, таким образом, вы можете распечатать номер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...