|
|
|
| простой запрос :
SELECT main.*, COUNT(cmnts.id) FROM main, cmnts WHERE main.id=2
GROUP BY 2
|
возвращает на локальном MySQL всё как хотелось,
а на другом 0 рядов
SELECT VERSION();
# показывает на первом:
5.0.45-community-nt
# , на втором
5.0.37-standard-log
|
таблицы идентичные .
сделал пока с подзапросом:
SELECT *, (SELECT COUNT(*) FROM cmnts) FROM main WHERE id=2
|
но наверное лучше всё одним запросом, т.к. этот запрос один из запросов объединённых при помощи UNION ALL ?
В чём может быть причина такого , и как ещё можно попробовать без подзапроса? | |
|
|
|
|
|
|
|
для: exp
(07.07.2008 в 16:06)
| | Вы бы написали, что хотите посчитать, и структуру таблиц бы привели.
Запросы - безобразные. | |
|
|
|
|
|
|
|
для: Trianon
(07.07.2008 в 16:13)
| | _ | |
|
|
|
|
|
|
|
для: Trianon
(07.07.2008 в 16:13)
| | И правда наверное безобразные запросы :)
примерно что-то похожее на скрипт новостей.
Две из таблиц -
CREATE TABLE IF NOT EXISTS `main` (
`id` INT( 6 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`dt` DATETIME NOT NULL ,
`u_name` TINYTEXT NOT NULL ,
`m_name` TINYTEXT NOT NULL ,
`msg` TEXT NOT NULL ,
`hide` ENUM( '0', '1' ) DEFAULT '0' NOT NULL ,
`razd` INT( 2 ) UNSIGNED DEFAULT 0 NOT NULL ,
PRIMARY KEY ( `id` ) ,
FULLTEXT ( `msg` )
) TYPE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS `cmnts` (
`id` INT( 8 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`dt` DATETIME NOT NULL,
`u_name` CHAR( 32 ) NOT NULL ,
`m_name` TINYTEXT NOT NULL ,
`msg` TEXT NOT NULL ,
`info` TEXT NOT NULL ,
`mes` INT( 6 ) UNSIGNED NOT NULL ,
PRIMARY KEY ( `id` ),
FULLTEXT ( `msg` )
) TYPE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
|
и после одного похожего запроса идёт второй , этот:
<?
$sql = m_query('( SELECT main.*, 1 AS cnt FROM main WHERE main.id=1 LIMIT 1 )
UNION ALL
(SELECT main.id, main.dt, main.u_name, main.m_name, INSERT(main.msg, 155, -1, CONCAT(\'<a href="./?' . $list . '_\', main.id, \'">.....читать</a>\')), main.hide, main.razd, COUNT(cmnts.id) FROM main LEFT JOIN cmnts ON main.id = cmnts.mes WHERE main.id > 2 AND main.hide=\'0\'
GROUP BY main.id ORDER BY main.dt DESC LIMIT '
. $COUNT .', ' . $c_msgs .' )
UNION ALL
( SELECT *, (SELECT COUNT(*) FROM cmnts) FROM main WHERE id=2
GROUP BY 2);', 1);
|
Далее из результата скриптом первый ряд выводится как шапка всех страниц
последний ряд как завершение, решил хранить их в той-же таблице с id 1 и2
, просто старался не делать более двух запросов на странице
$c_msgs - сообщений на странице
$COUNT - стартовый ряд
$list - номер страницы начиная с нуля | |
|
|
|
|
|
|
|
для: exp
(07.07.2008 в 16:33)
| | во втором count() колличество комментариев к новости
в третьем всего комментариев | |
|
|
|
|
|
|
|
для: exp
(07.07.2008 в 16:33)
| | по-моему, сокращать количество запросов с трех до одного на страницу - это уже болезнь :)
И если COUNT(*) Вы втискиваете лишь затем, чтоб отдельный запрос не плодить... нет, дело Ваше, конечно, просто я затрудняюсь Вам что-то посоветовать по делу.
Под безобразным запросом я имел в виду группирующий запрос с повисшими полями - т.е. полями, перечисленными в списке SELECT вне агрегатных функций и не указанными в GROUP BY (Приличные СУБД такие запросы просто отвергают.) | |
|
|
|
|
|
|
|
для: Trianon
(07.07.2008 в 16:54)
| | Oказалось просто из-за того что в таблице cmnts в одной из двух BD небыло не одной записи
но интересно почему-же без подзапроса уже так не работает :)
Теперь только придётся делать как-то так ;)
SELECT main.*, COUNT(cmnts.id) - 1 FROM main, cmnts WHERE main.id=2 GROUP BY 2
|
| |
|
|
|