singlepost

Помогите с запросом mysql! << На главную или назад  

//compilim.ru/forum.php вот тут на форуме чтобы вывести список тем я использую запрос
————————————————————————
SELECT qf.*, author.name, author.lastname, last.name, last.lastname
FROM forums AS qf
LEFT JOIN users AS author ON qf.uid = author.id
LEFT JOIN users AS last ON qf.last_user = last.id
ORDER BY last_data DESC

который вытаскивает ВСЕ темы, присоеденяет к каждой имя автора и последнего комментатора

вывожу все это дело
————————————————————————-
for($i = 1; $i < $countProg+1; $i++)
{
$addBlock .= echoForumLang($i, $myCount[$i]);
foreach($rows as $row)
{
if($row['mid'] == $i and $k++ < 2)
{
if(!$row['mini']) !$row['mini'] = 'Нет описания';
$addBlock .=echoForumTheme($row);
}
} $k = 0;
}
—————————————————————————
в цикле по всем языкам я создаю блоки…

$addBlock – содержит блок текущего языка (синяя полоска)
иechoForumTheme($row) – саму тему

$row['mid'] – содержит идентификатор языка

Проблема в том что я из базы достаю все записи форумов! А внадо только к каждому языку по 2 последние темы!

Кто может помочь?

66 ответов в теме “Помогите с запросом mysql!”

  1. 13
    Антон Кононов ответил:

    соглашусь с лютым евгением что один сложный запрос лучше много маленьких, но на порядках более 100 я думаю. :)

    в твоем случае реально это все и в один запрос забить, а не в 40

  2. 12
    Евгений Лютый ответил:

    запрос в цикле – отстой, лучше сделать один сложный запрос чем 40 простых

  3. 11
    Деня Татаринов ответил:

    Спасибо огромное будем разбирать! А если сделать запрос в цикле(самый простой вариант)- 40 запросов (это не слишком много) ?

  4. 10
    Евгений Лютый ответил:

    SELECT DISTINCT
    f.mid, — ID языка
    CASE
    WHEN rec_indexes.rec_idx=0 THEN — если нужно достать последнюю запись
    (SELECT f1.id FROM formus f1 WHERE f1.mid=f.mid ORDER BY f1.last_data DESC LIMIT 0, 1)
    WHEN rec_indexes.rec_idx=1 THEN — если нужно достать предпоследнюю запись
    (SELECT f1.id FROM formus f1 WHERE f1.mid=f.mid ORDER BY f1.last_data DESC LIMIT 1, 1)
    END AS latest_record_id

    FROM forums f,
    (SELECT 0 AS rec_idx UNION SELECT 1) rec_indexes — табличка для того, чтобы для каждого языка можно было иметь 2 записи в результате

    – что-то типа такого

  5. 9
    Евгений Лютый ответил:

    блин, контакт все пробелы вначале строк поудалал, некрасиво получилось :(

  6. 8
    Евгений Лютый ответил:

    ну это айдишники достаются, можно сджоинить forums с результатами этого запроса и выбрать все поля

  7. 7
    Деня Татаринов ответил:

    можно пример?

  8. 6
    Деня Татаринов ответил:

    Языки в массиве – удобнее тем что лишний раз не надо делать запрос=)

  9. 5
    Евгений Лютый ответил:

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

  10. 4
    Евгений Лютый ответил:

    Нужно, чтобы языки были в таблице отдельной. Это, во-первых, гораздо правильнее с точки зрения здравого смысла :) А во-вторых, в таком случае можно будет сделать запрос для таблицы languages (или как ты ее назовешь) и для каждого языка сделать подзапрос, возвращающий нужную тебе информацию. Можно это сделать и без отдельной таблицы, например сделать SELECT DISTINCT по полю mid, чтобы выбрать все языки, по которым есть записи, и сделать подзапросы для каждого mid.

  11. 3
    Деня Татаринов ответил:

    Можно конешно в цикле сделать запрос, но 40 запросов…

  12. 2
    Деня Татаринов ответил:

    $lang_prog = array('1'=>'Assembler','2'=>'HTML', '3'=>'JavaS?1?ript','4'=>'VBScript', '5'=>'CSS','6'=>'FLASH','7'=>'PERL','9'=>'Delphi','8'=>'PHP'
    ,'10'=>'Pascal','11'=>'MySQL','12'=>'SSI','13'=>'VRML','14'=>'ColdFusion', '15'=>'TurboPascal','16'=>'KOBOL',
    '17'=>'C', '18'=>'Lua', '19'=>'MATLAB','20'=>'MAPLE', '21'=>'C++','22'=>'C#','23'=>'Java','24'=>'Python',
    '25'=>'RUBY', '26'=>'Vala', '27'=>'VisualBasic','28'=>'MSSQL', '29'=>'PostregeSQL','30'=>'ASP, ASP.NET', '31'=>'OBERON', '32'=>'CGI',
    '33'=>'ActionScript','34'=>'XML', '35'=>'AJAX', '36'=>'SAS', '37'=>'D', '38'=>'ADA', '39'=>'Visual FoxPro','40'=>'C++/CLI',);

    языки в массиве

    структура базы форума
    id | title | mini | mid | uid | numm | last_data | last_user| send
    ————————————————————————
    идентификатор
    заголовок
    краткое описание
    к какому языку относится
    кто создал форум
    количество сообщений
    последнее обнавление
    последний пользователь
    - не помню – =)

  13. 1
    Евгений Лютый ответил:

    А структуру базы привести? Хотя бы таблицу forums и таблицу, в которой все языки содержатся

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.