Всем привет, и сразу спасибо за отклик!
Итак, есть полностью идентичные таблицы (пусть их будет 10), но с разными названиями..
нужно выбрать все поля из все этих 10-и таблиц (названия полей тоже олинаковы) и сделать общую сортировку по полю dateofpublication desc (общая - значит не каждая таблица отсортирована таким образом независимо друг от друга, а такая сортировка как будто мы сортируем данные из одно таблицы)
в интеренет смотрел, нашел вроде бы пример, но:
1) запрос получается огромаднейший! - так как в примере написано что когда делаем выборку из нескольких таблиц просто везде указываем какие поля к какой принадлежат
2) этот запрос у меня неправильно работает:)
3) мне нужно все это в массиве mysql_fetch_array
структура таблиц неважна поэтому я ее непривожу..
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
а можно раскрыть принцип работы даного запроса???
from tbl1
inner join tbl2 on tbl1.field1 = tbl2.field1
inner join tbl3 on tbl3.field1 = tbl2.field1
как это работает???
почитай про join .. on ..
там разные варианты есть
А не UNION ли тут нужен?
"КОГДА ВЫ МОЖЕТЕ ДЕЛАТЬ ОБЪЕДИНЕНИЕ МЕЖДУ ЗАПРОСАМИ ?
Когда два ( или более ) запроса подвергаются объединению, их столбцы вывода должны быть совместимы для объединения. Это означает, что каждый запрос должен указывать одинаковое число столбцов и в том же порядке что и первый, второй, третий, и так далее, и каждый должен иметь тип, совместимый с каждым. Значение совместимости типов – меняется. Ограничение на совместимость – это когда пустые значения(NULL) запрещены в любом столбце объединения, причем эти значения необходимо запретить и для всех соответствующих столбцов в других запросах объединения. Кроме того, вы не можете использовать UNION в под- запросах, а также не можете использовать агрегатные функции в предложении SELECT запроса в объединении. ( Большинство программ пренебрегают этими ограничениями. )"
Тут подробно и с примерами:
http://www.sql.ru/docs/sql/u_sql/ch14.shtml
ступил, юнион конечно
прочитал.., я как понял можно делать "пометки" из какой таблицы данные были выбраны при использовании union???
можно какой нибудь ваши пример, и еще не понятно зачем одинаковое количество символов (там в примере 'Highest on' и ' Lowest on')
и еще, по умолчанию union не выводит одинаковые данные из разных таблиц?
1) все значения полей должны быть идентичны, чтобы вывода не происходило? (дупликация)
2) что надо прописать в запросе если я хочу чтобы одинаковые записи выводились???
union distinct – отличие от остальных?
union – отличие от остальных?
union all – отличие от остальных?
Игорь,
допустим у тебя в каждой из таблиц есть по два поля 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 таблиц с одинаковыми полями… нормализации ноль чтоли?
Надо продумывать БД до того, как начнешь ее создавать, а не после.. грозит серьезными последствиями и геморроем с кулак )
я продумывал б д до реализации, решил, что так будет аккуратнее и логичнее – в разных таблицах пусть и одинаковых!
я делаю блог – думаю мое решение правильное, что в разных таблицах (там новости по категориям размещены)
если бы я делал что новости со всех категорий в одной б д были – она бы разраслась – а там еще постраничный вывод делать! – представляешь какой бы тогда геморр начался?
одно дело выбрать данные по одной категории из одной таблицы ГДЕ ВСЕ НОВОСТИ СО ВСЕХ КАТЕГОРИЙ – другое дело – новости в разных таблицах..
или я неправ? – какое твое мнение?
Лично я согласен с предыдущими одной таблицы хватит и работать будет как часы… Просто время "поиска" в БД меньше чем время обработки скриптом и передачи данных… Когда писал поисковую систему при 300 млн записей время выполнения запроса составлял десятки мили секунд в то время как выполнение и передача скрипта около секунды. Лучше сделать 1 запрос который будет давать готовый результат, чем писать код который обрабатывает данные.
Игорь,
а также по желанию сделать табличку типов, где будет соответствие идентификатора типа и названия типа, и у тебя сраазу появится гибкость системы, такая как возможность добавлять в систему новые категории малой кровью.
мое мнение, навеяное умными людьми такое, что чем меньше повторений в БД, тем она будет шустрее работать. Выборка из 10 таблиц, это целых 10 операций, плюс 10 ть сортировок и т.д. Ну а из одной таблицы – сам понимаешь.
Это не логичнее держать в разных таблах разные категории!!!
Логичнее в таблице содержимого категорий сделать поле ТИП – где будет хранится идентификатор таблы. И весь гимор кончится на дополнительном условии "AND type=N "
учту на будущее!
Ни один нормальный движок не использует "для каждой категории" отдельную таблу, это полное кощунство!
> одно дело выбрать данные по одной категории из одной таблицы ГДЕ ВСЕ НОВОСТИ СО ВСЕХ КАТЕГОРИЙ – другое дело – новости в разных таблицах..
или я неправ? – какое твое мнение?
выбирать новости из одной таблицы – хоть все сразу, хоть для заданой категории, в разы проще, делается это одной строкой, сортируется одним циклом. Кода меньше на порядок и работать побыстрее будет.