Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: вывод альбомов. помогите составить запрос
 
 автор: t3ma   (22.09.2009 в 15:24)   письмо автору
 
 

Требуется вывести четыре последних добавленных альбома , только с одним условием, чтобы бы альбом был не пустой, была хотябы одна фотография в нем.

делаю так:


<?php
$get_new_albums 
mysql_query("SELECT * FROM gl_albums WHERE ORDER BY id DESC LIMIT 4");

if (
mysql_num_rows($get_new_albums) > 0){

  while (
$album mysql_fetch_array($get_new_albums)){
    
$get_images mysql_query("SELECT * FROM gl_images WHERE album=".$album['id']." AND status=show");
        if (
mysql_num_rows($get_images) > 0){
               
                  
// Тут выводим альбомы в которых есть хотябы одна фотография
        
}

?>


тоесть если фоток допустим в одном альбоме не будет то выведется всего 3 альбома...
немогу понять как сделать чтобы всегда выводилось 4 последних албома с фотками, тоесть если попадется албом в котором нет фотографий он пропускался (не считался скриптом)

--
-- Структура таблицы `gl_images`
--

CREATE TABLE IF NOT EXISTS `gl_images` (
  `id` int(11) NOT NULL auto_increment,
  `filename` varchar(50) NOT NULL default '',
  `album` int(11) NOT NULL default '0',
  `status` enum('hide','not_auth','show') NOT NULL default 'not_auth',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=336 ;

--
-- Структура таблицы `gl_albums`
--

CREATE TABLE IF NOT EXISTS `gl_albums` (
  `id` int(11) NOT NULL auto_increment,
  `date` text NOT NULL,
  `parent` int(11) NOT NULL default '0',
  `a_name` varchar(40) NOT NULL default '',
  `description` varchar(520) NOT NULL,
  `category` int(11) NOT NULL default '0',
  `commentation` varchar(24) NOT NULL,
  `count` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=303 ;

  Ответить  
 
 автор: cheops   (22.09.2009 в 15:34)   письмо автору
 
   для: t3ma   (22.09.2009 в 15:24)
 

Можно поступить следующим образом
SELECT gl_albums.id AD id,
       gl_albums.date AS date,
       gl_albums.parent AS parent,
       gl_albums.a_name AS a_name,
       gl_albums.description AS description,
       gl_albums.commentation AS commentation,
       gl_albums.count AS count
FROM gl_albums JOIN gl_images ON gl_albums.id = gl_images.album
WHERE gl_albums.status <> 'hide' 
GROUP BY id
ORDER BY id DESC
LIMIT 4

Если count в таблице gl_albums - это количество фото в альбоме, тогда можно упростить запрос до
SELECT * FROM gl_albums
WHERE `status` <> 'hide' AND `count` > 0
ORDER BY id DESC
LIMIT 4

  Ответить  
 
 автор: t3ma   (22.09.2009 в 15:54)   письмо автору
 
   для: cheops   (22.09.2009 в 15:34)
 

не работает

не понятен мне запрос, если можно объясните по строчкам

WHERE gl_albums.status <> 'hide'
в gl_albums вообще нет поля статус

помогите пожалуйста)

  Ответить  
 
 автор: cheops   (22.09.2009 в 16:07)   письмо автору
 
   для: t3ma   (22.09.2009 в 15:54)
 

Да, попутал, меня смутила строчка WHERE ORDER BY в вашем первом запросе. Это двухтабличный запрос - участвуют таблицы gl_albums и gl_images. В SELECT-запросе выводится список полей таблицы gl_albums
SELECT gl_albums.id AD id,
       gl_albums.date AS date, 
       gl_albums.parent AS parent, 
       gl_albums.a_name AS a_name, 
       gl_albums.description AS description, 
       gl_albums.commentation AS commentation, 
       gl_albums.count AS count 
FROM gl_albums JOIN gl_images ON gl_albums.id = gl_images.album 
GROUP BY id 
ORDER BY id DESC 
LIMIT 4

ON gl_albums.id = gl_images.album - это связь таблиц друг с другом, GROUP BY сообщает, что записи должны группироваться по полю gl_albums.id - это позволяет отсекать лишние записи, которые неизбежно образуются при объединении таблиц.

Игра идет на том, что при объединении таблиц в результирующей таблице не появятся записи из gl_albums для которых нет ни одного соответсвия в gl_images.

  Ответить  
 
 автор: t3ma   (22.09.2009 в 16:23)   письмо автору
 
   для: cheops   (22.09.2009 в 16:07)
 

а куда добавить AND status=show ?

все равно неработает ничего.. или я делаю неправильно..
<?php
$get_new_foto 
= @mysql_query("SELECT gl_albums.id AD id, 
       gl_albums.date AS date,  
       gl_albums.parent AS parent,  
       gl_albums.a_name AS a_name,  
       gl_albums.description AS description,  
       gl_albums.commentation AS commentation,  
       gl_albums.count AS count  
FROM gl_albums JOIN gl_images ON gl_albums.id = gl_images.album  
GROUP BY id  
ORDER BY id DESC  
LIMIT 4"
);
$image = @mysql_fetch_array($get_new_foto);
print_r($image);

?>


ничего в итоге невыводит...

  Ответить  
 
 автор: cheops   (22.09.2009 в 16:31)   письмо автору
 
   для: t3ma   (22.09.2009 в 16:23)
 

У вас дампы таблиц большие? Можете их прикрепить, чтобы можно было воспроизвести ситуацию?

Условие можно добавить так
<?php 
$get_new_foto 
= @mysql_query("SELECT gl_albums.id AD id,  
       gl_albums.date AS date,   
       gl_albums.parent AS parent,   
       gl_albums.a_name AS a_name,   
       gl_albums.description AS description,   
       gl_albums.commentation AS commentation,   
       gl_albums.count AS count   
FROM gl_albums JOIN gl_images ON gl_albums.id = gl_images.album   
WHERE gl_images.status = 'show' 
GROUP BY id   
ORDER BY id DESC   
LIMIT 4"
); 
$image = @mysql_fetch_array($get_new_foto); 
print_r($image); 

?>

  Ответить  
 
 автор: t3ma   (22.09.2009 в 16:59)   письмо автору
 
   для: cheops   (22.09.2009 в 16:31)
 

вот дамп для наглядности


--
-- Структура таблицы `gl_albums`
--

CREATE TABLE IF NOT EXISTS `gl_albums` (
  `id` int(11) NOT NULL auto_increment,
  `date` text NOT NULL,
  `parent` int(11) NOT NULL default '0',
  `a_name` varchar(40) NOT NULL default '',
  `description` varchar(520) NOT NULL,
  `category` int(11) NOT NULL default '0',
  `commentation` varchar(24) NOT NULL,
  `count` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=303 ;

--
-- Дамп данных таблицы `gl_albums`
--

INSERT INTO `gl_albums` (`id`, `date`, `parent`, `a_name`, `description`, `category`, `commentation`, `count`) VALUES
(231, '', 5, 'альбомчин5', '', 10, 'yes', 20),
(5, '', 21, 'проверка', '', 9, '', 14),
(21, '', 231, 'просто', '', 9, '', 14);



--
-- Структура таблицы `gl_images`
--

CREATE TABLE IF NOT EXISTS `gl_images` (
  `id` int(11) NOT NULL auto_increment,
  `filename` varchar(50) NOT NULL default '',
  `album` int(11) NOT NULL default '0',
  `status` enum('hide','not_auth','show') NOT NULL default 'not_auth',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=336 ;

--
-- Дамп данных таблицы `gl_images`
--

INSERT INTO `gl_images` (`id`, `filename`, `album`, `status`) VALUES
(127, '20081208155124.jpg', 5, 'show'),
(128, '20081208155147.jpg', 231, 'show'),
(129, '20081208155426.jpg', 231, 'show'),
(130, '20081208155504.jpg', 231, 'show'),
(131, '20081208155538.jpg', 231, 'show'),
(132, '20081208155733.jpg', 21, 'show'),
(133, '20081208155754.jpg', 21, 'show');

  Ответить  
 
 автор: cheops   (22.09.2009 в 17:14)   письмо автору
 
   для: t3ma   (22.09.2009 в 16:59)
 

Исправьте запрос следующим образом
SELECT gl_albums.id AS id,   
       gl_albums.date AS date,    
       gl_albums.parent AS parent,    
       gl_albums.a_name AS a_name,    
       gl_albums.description AS description,    
       gl_albums.commentation AS commentation,    
       gl_albums.count AS count    
FROM gl_albums JOIN gl_images ON gl_albums.id = gl_images.album    
WHERE gl_images.status = 'show'  
GROUP BY id    
ORDER BY id DESC    
LIMIT 4

  Ответить  
 
 автор: t3ma   (22.09.2009 в 17:59)   письмо автору
 
   для: cheops   (22.09.2009 в 17:14)
 

Спасибо большое, работает! :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования