Делимся секретами создания сайтов

Сложный запрос по выборке данных из нескольких таблиц (10-15) с одинаковыми полями, where поле dateofpublication каждой таблицы = $переменная с общей сортировкой по полю dateofpublicationunix desc

Всем привет, и сразу спасибо за отклик!

Итак, есть полностью идентичные таблицы (пусть их будет 10), но с разными названиями..

нужно выбрать все поля из все этих 10-и таблиц (названия полей тоже олинаковы) и сделать общую сортировку по полю dateofpublication desc (общая - значит не каждая таблица отсортирована таким образом независимо друг от друга, а такая сортировка как будто мы сортируем данные из одно таблицы)

в интеренет смотрел, нашел вроде бы пример, но:

1) запрос получается огромаднейший! - так как в примере написано что когда делаем выборку из нескольких таблиц просто везде указываем какие поля к какой принадлежат
2) этот запрос у меня неправильно работает:)
3) мне нужно все это в массиве mysql_fetch_array

структура таблиц неважна поэтому я ее непривожу..

Ответы: 15 → “Сложный запрос по выборке данных из нескольких таблиц (10-15) с одинаковыми полями, where поле dateofpublication каждой таблицы = $переменная с общей сортировкой по полю dateofpublicationunix desc”

  1. Вадим Чиняев Ответить

    select tbl1.*, tbl2.*, tbl3.*
    from tbl1
    inner join tbl2 on tbl1.field1 = tbl2.field1
    inner join tbl3 on tbl3.field1 = tbl2.field1
    order by tbl1.field1

  2. Игорь Самохин Ответить

    а можно раскрыть принцип работы даного запроса???

    from tbl1
    inner join tbl2 on tbl1.field1 = tbl2.field1
    inner join tbl3 on tbl3.field1 = tbl2.field1

    как это работает???

  3. Олег Тарасов Ответить

    почитай про join .. on ..
    там разные варианты есть

  4. Александр Сердюк Ответить

    А не UNION ли тут нужен?
    "КОГДА ВЫ МОЖЕТЕ ДЕЛАТЬ ОБЪЕДИНЕНИЕ МЕЖДУ ЗАПРОСАМИ ?
    Когда два ( или более ) запроса подвергаются объединению, их столбцы вывода должны быть совместимы для объединения. Это означает, что каждый запрос должен указывать одинаковое число столбцов и в том же порядке что и первый, второй, третий, и так далее, и каждый должен иметь тип, совместимый с каждым. Значение совместимости типов – меняется. Ограничение на совместимость – это когда пустые значения(NULL) запрещены в любом столбце объединения, причем эти значения необходимо запретить и для всех соответствующих столбцов в других запросах объединения. Кроме того, вы не можете использовать UNION в под- запросах, а также не можете использовать агрегатные функции в предложении SELECT запроса в объединении. ( Большинство программ пренебрегают этими ограничениями. )"

    Тут подробно и с примерами:
    http://www.sql.ru/docs/sql/u_sql/ch14.shtml

  5. Вадим Чиняев Ответить

    ступил, юнион конечно

  6. Игорь Самохин Ответить

    прочитал.., я как понял можно делать "пометки" из какой таблицы данные были выбраны при использовании union???

    можно какой нибудь ваши пример, и еще не понятно зачем одинаковое количество символов (там в примере 'Highest on' и ' Lowest on')

  7. Игорь Самохин Ответить

    и еще, по умолчанию union не выводит одинаковые данные из разных таблиц?

    1) все значения полей должны быть идентичны, чтобы вывода не происходило? (дупликация)
    2) что надо прописать в запросе если я хочу чтобы одинаковые записи выводились???

  8. Игорь Самохин Ответить

    union distinct – отличие от остальных?

    union – отличие от остальных?

    union all – отличие от остальных?

  9. Александр Сердюк Ответить

    Игорь,
    допустим у тебя в каждой из таблиц есть по два поля field1 и field2

    SELECT *, 'TABLE1' as fromtable FROM table1[WHERE <условия>]
    UNION
    SELECT *, 'TABLE2' as fromtable FROM table2 [WHERE <условия>]
    UNION
    ….
    UNION
    SELECT *, 'TABLEN' as fromtable FROM tableN [WHERE <условия>]
    ORDER BY dateofpublication DESC;
    (где [...] – опционально)
    "UNION будет автоматически исключать дубликаты строк из вывода."
    UNION ALL – вывод и дубликатов В ТОМ ЧИСЛЕ, но не во всякой базе данных(допустим в постгрес будет вести себя иначе, чем в мускуле).

    Ну и пхп код чтобы извлечь данные

    <?php

    ..//коннект к базе, работа скрипта

    $query="…";
    $res= mysql_query($query);

    while($f_res=mysql_fetch_array($res))
    {
    …. //че хошь делай
    echo "Поле1: ".$f_res['field1']." поле2: ".$f_res['field2']." из таблицы ".$f_res['fromtable']."\r\n<br>\r\n";
    …// да и тут че хошь делай
    }
    ?>

  10. Александр Сердюк Ответить

    А вообще, 10 таблиц с одинаковыми полями… нормализации ноль чтоли? :) Надо продумывать БД до того, как начнешь ее создавать, а не после.. грозит серьезными последствиями и геморроем с кулак )

  11. Игорь Самохин Ответить

    я продумывал б д до реализации, решил, что так будет аккуратнее и логичнее – в разных таблицах пусть и одинаковых!

    я делаю блог – думаю мое решение правильное, что в разных таблицах (там новости по категориям размещены)

    если бы я делал что новости со всех категорий в одной б д были – она бы разраслась – а там еще постраничный вывод делать! – представляешь какой бы тогда геморр начался?

    одно дело выбрать данные по одной категории из одной таблицы ГДЕ ВСЕ НОВОСТИ СО ВСЕХ КАТЕГОРИЙ – другое дело – новости в разных таблицах..

    или я неправ? – какое твое мнение?

  12. Дмитрий Шумейко Ответить

    Лично я согласен с предыдущими одной таблицы хватит и работать будет как часы… Просто время "поиска" в БД меньше чем время обработки скриптом и передачи данных… Когда писал поисковую систему при 300 млн записей время выполнения запроса составлял десятки мили секунд в то время как выполнение и передача скрипта около секунды. Лучше сделать 1 запрос который будет давать готовый результат, чем писать код который обрабатывает данные.

  13. Александр Сердюк Ответить

    Игорь,
    мое мнение, навеяное умными людьми такое, что чем меньше повторений в БД, тем она будет шустрее работать. Выборка из 10 таблиц, это целых 10 операций, плюс 10 ть сортировок и т.д. Ну а из одной таблицы – сам понимаешь.
    Это не логичнее держать в разных таблах разные категории!!!
    Логичнее в таблице содержимого категорий сделать поле ТИП – где будет хранится идентификатор таблы. И весь гимор кончится на дополнительном условии "AND type=N " :) а также по желанию сделать табличку типов, где будет соответствие идентификатора типа и названия типа, и у тебя сраазу появится гибкость системы, такая как возможность добавлять в систему новые категории малой кровью.

  14. Игорь Самохин Ответить

    учту на будущее!

  15. Сволычъ Редкостный Ответить

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

    > одно дело выбрать данные по одной категории из одной таблицы ГДЕ ВСЕ НОВОСТИ СО ВСЕХ КАТЕГОРИЙ – другое дело – новости в разных таблицах..
    или я неправ? – какое твое мнение?

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

Ответить