|
|
|
| Требуется вывести четыре последних добавленных альбома , только с одним условием, чтобы бы альбом был не пустой, была хотябы одна фотография в нем.
делаю так:
<?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 ;
|
| |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: cheops
(22.09.2009 в 15:34)
| | не работает
не понятен мне запрос, если можно объясните по строчкам
WHERE gl_albums.status <> 'hide'
в gl_albums вообще нет поля статус
помогите пожалуйста) | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: 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);
?>
|
ничего в итоге невыводит... | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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');
|
| |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: cheops
(22.09.2009 в 17:14)
| | Спасибо большое, работает! :) | |
|
|
|
|