Forum Webscript.Ru
Программирование => PHP => Тема начата: UltraMax от 28 Июля 2003, 16:05:04
-
Просмотрел поиск - так ничего для себя нужного не нашел, слишком в поиске все просто :)
Итак такая беда.
Надо делать вывод из 5 таблиц в MySQL
Вывод каждой записи из таблицы, оформляется по разному. То есть все то что из первой таблицы нашлось, оформляется одним способом, из второй, вторым и так все 5 штук..
Вывод я сделал, но нужно выводить не более чем 20 записей из всех таблиц на одну страницу. Внимание вопрос - как это сделать? Сначала я пытался делать все одним запросом, не получилось, так как я не придумал, как можно понять какая запись к какой таблице относится, и оформлять ее соотвествующим только ей html кодом. Сделал 5 запросов, тут все ок, но как ограничить вывод ВСЕХ записей 20 штуками??? Как не бился, не могу придумать алгоритм выдергивания. Может можно все 5 результатов объеденить в массив, и уже из него по 20 выводить? Может кто подскажет технологию данного вывода, бо сам я далеко не профи в PHP? Через один запрос делать (как?) или через 5 отдельных(тут вообще не могу догадаться как).
Заранее спасибо всем, кто сможет помочь :) Очень блин надо :)
-
Если просто 20-ю записями ограничить, то в каждом select\'e "... LIMIT от, до". (4x5)
А если допустим в одной таблице не нашлось ничего? Какой принцип у тебя?
-
У меня стоит проверка, если во всех 5 таблицах ничего нет, пишет что пусто.
Главное - чтобы хоть что-то было. Пусть даже в четырех ничего не будет, но если в одной будет - будет из нее выводить.
Что значит ограничить 20-ую? Я и хочу ограничить 20-ую! Или ты имеешь ввиду в каждом запросе? Ну хорошо,ограничил я в каждом запросе по 20. А всего нашло 20 в одной (причем реально их допусти 44), 7 в другой, и 4 в третей. И как мне это разбивая по 20 ОБЩИЙ(!!!) итог (то есть 44+7+4=55) вывести? Вот что интересует. :)
Я вот задумался - может лучше выводить сначала из одной? Как только в ней все повыводить, начинать искать в другой? Только что-то я себе это не очень представляю. Запихнуть в цикл, и пока первую таблицу не разберет, не переходить к другим???. Брр, мне аж страшно стало :)
-
А если вначале все запихнуть в HEAP Tables (http://www.mysql.com/doc/en/HEAP.html), а уж из нее выводить.
-
круто. это самый лучший выход из ситуации.
-
а как на счет - http://www.mysql.com/doc/en/MERGE.html (http://www.mysql.com/doc/en/MERGE.html) обедененных таблиц? и что лучше в данной ситуации?
-
Стоп граждане, но что толку от временных таблиц, мне же надо записи из рахзных таблиц по раному обрабатывать. Как вариант - можно в каждую запись передавать параметр навзания таблицы например (тут я уж придумаю что-либо), но вот начал рассматривать Insert ... Select - и не могу найти понять, можно ли втсавлять во врменную таблицу (хоть какую) данные из selecta если там всего три поля, а четвертое надо вставлят самому? Можно ли так сделать? Если да - может можно пример как?
-
UltraMax:
Стоп граждане, но что толку от временных таблиц, мне же надо записи из рахзных таблиц по раному обрабатывать.
Обработай приведи к единому знаменателю и во временную таблицу.
А вообще не плохо бы знать структуру БД.
-
SELECT \'tab_name\', field1, field2 FROM tab_name;
-
Макс ... или я сошла с ума, или меня не понимают :)
повторяю - есть таблица, назовем ее tmp, в ней 4 поля. Три поля заполняются данными из других таблиц, но 4=ое я вставляю сам! 4-го поля нет в таблицах, из которых берутся данные!!!
Как Insert ... Select тут употребить?
INSERT INTO tmp (first,second,third) SELECT a,b,c FROM TITLE WHERE тряляля и вот как судя вставить 4-ое значение?
Свое? Не из таблицы, с свое? Синтаксис господа - синтаксис. И можно ли так вообще
-
я тебе и показал синтаксис SELECT-а.
INSERT INTO tmp (first,second,third,fourth) SELECT a,b,c,\'title\' FROM TITLE WHERE ля ляля ля
особое внимание прошу обратить на поле fourth в INSERT-е и \'title\' (кавычки обязательны) в SELECT-е
-
UltraMax
Т.е. как я понял кол-во записей в каждом предыдущем запросе зависит от результата в последующих... Как мне кажется это несколько не правильная логика, надо хотя бы определить минимальное кол-во возвращенных записей независимо от результатов последующих запросов...
Сам посотри как ты хочешь: Чтобы вывести n-ое кол-во записей ты допустм 1-го запроса ты должен знать вернут ли тебе что-нибудь 4 последующих, а их надо сначала посчитать (как мне видится дополнительные запросы неизбежны, но правомертны ли)
Может есть смысл пересмотреть идеологию вывода...
Скажи хотя бы для чего ты хочешь это реализовать? Пример работающего аналога? Может, что более путнее посоветуют...
-
Wyclef, да я уже все сделал
На основании верменных таблиц.
Повторяю - у меня было 5 таблиц. Из них нуно было выдернуть записи. Но группа записей каждой таблицы оборачивалась своим html кодом. А общий вывод надо было делать постранично, 20 записей максимум. Поэтому общий SELECT не проходил, ведь потом бы невозможно было разобрать какую запись, как именно парсить.
Для этого было сделано 5 отдельных INSERT с SELECT-ами, во временную таблицу, и одновременно в каждом Insert ... SELECT шел свой параметр, уникальный для каждый таблицы. Вот и получилось, чт была таблица со всеми необходимыми записями, но у каждой был свой прихнак как ее оборачивать
Ну а уж из одной таблицы грешно не сделать постраничный вовод на основе LIMIT ;)
Вроде все объяснил.
Огромное спасибо Максу за разъяснение ка квставить свой параметр в Insert ... SELECT
Да и всем тоже спасибо.
Ура товарищи :)
-
UltraMax
Одобрямс, молодчик :)
-
вообще-то я не вижу большой разницы между организацией такого массива в мускуле и в РНР.
Ну, разве что, у мускуля памяти больше.
Зависит от размера таблиц, но я бы все-таки, сделал пару шагов в сторону оптимизации - к примеру, собирал бы во временную таблицу не целиком записи, а айдишники таблиц и записей.
а уж сделать потом на странице 1-4 селекта для полных записей - не проблема.
И еще. Здесь весь поиск делается, как я понимаю, при обращении к каждой странице.
Лично я бы сделал нормальную, не временную таблицу, в которую бы собирал результат запроса. (те же айдишники)
а потом кроном бы чистил.
а за грубость извиняюсь.
посмотрел повнимательнее - да, действительно, ту фразу можно толковать довояко.
но я, правда, в тебе не ошибся - это видно по последовавшим комментариям ;-)
-
Wyclef
[off] человек сюда приходит за помощью и он прежде всего заинтересован в том, чтобы мы его правильно поняли. Поэтому пусть выражают свои мысли четко и ясно [/off]
по поводу темы - ИМХО нужно было сразу проэктировать систему так, чтобы не сталкиваться с поиском по 5 таблицам
-
Макс:
ИМХО нужно было сразу проэктировать систему так, чтобы не сталкиваться с поиском по 5 таблицам
Точно. Явно не оптимальная БД. Поэтому такие сложности на этапе формирования запросов.
-
Ребята - дело в том, что я работаю с доставшейся в наследок от неизвестно кого базой, причем база живая. И последнее - я не имею права ее модифицировать, так что приходится изворачиваться как могу :)
-
Уфф, всем привет - это я опять :)
Короче все мучаюсь в последний раз (надеюсь) с этой гребаной базой
В общем мне необходимо к моему готову постраничному поиску прикрутить еще один поисковый скрипт, и уже результаты общие выводить тоже постранично... ужас короче
Дело в том, что второй скрипт совсем иначе делает выбор, и по другому парсит полученные данные. Я тут думал, думал - понял что это реализовать можно только таким образом - скидывать по 20 результаты моего скрипта, а как только они закончатся, начинать новую темповую таблицу для результатов нового скрипта и выводить их.
Так вот вопрос (внимание, знатоки :)) Как отследить когда закончилась выборка из первой моей темповой таблицы, и начинать создавать новую от нового скрипта поиска. Еще учитывать надо что если от первого скрипта осталось 3 результата, то к нему надо доплюсовать еще 17 от нового. Вот такой вот вопрос.
Могу сказать в скрипте есть параметры $offset (говорит на сколько надо сместить select вниз от начала самого селекта), и $tot_all (говорит сколько всего записей в темповой таблице)
-
на держи
$query = "SELECT title FROM table1";
$result = mysql_query($query);
while($value = mysql_fetch_array($result))
{
$i[][1] = $value[\'title\'];
}
$query = "SELECT title FROM table2";
$result = mysql_query($query);
while($value = mysql_fetch_array($result))
{
$i[][2] = $value[\'title\'];
}
$query = "SELECT title FROM table3";
$result = mysql_query($query);
while($value = mysql_fetch_array($result))
{
$i[][3] = $value[\'title\'];
}
$query = "SELECT title FROM table4";
$result = mysql_query($query);
while($value = mysql_fetch_array($result))
{
$i[][4] = $value[\'title\'];
}
// Вместо count($i) поставь то число количество записей которое тебе нужно выводить.
if(count($i) != \'0\')
{
for($ii = 0; $ii <= count($i); $ii++)
{
echo "".$i[$ii][1]." ";
echo "".$i[$ii][2]." ";
echo "".$i[$ii][3]." ";
echo "".$i[$ii][4]."
";
}
}
else
{
echo "Íè÷åãî íåò";
}
P.S. Код понятен до невозмодности... Старался :)
пользуйся
-
здесь я даже комментировать ничего не буду...
-
UltraMax
[off]
[moderated]
последнее китайское за 3.14. еще одна подобная выходка - забаню... :abuse:
если тебе не нравится, как человек тебе ответил - не надо опускаться до ругани.
[/moderated]
[/off]
-
nobody спасибо, возможно пригодится, но я уже немножко по другому сделал :)
Возможно не так красиво, но тоже работает :)
Если интересно - могу код скинуть
-
т.е., все-таки все загнал в массив?
Так бы и сказал, что база небольшая, а поиском пользуются неактивно.
-
Какой массив?
Нет, я сделал так. Сначал идет выбор из первой темповой таблицы, до тех пор, пока в ней не останется результатов меньше двадцати. Тогда начинается создаваться вторая темповая таблица, с результатами поиска из второго скрипта, и в зависимости от того, сколько осталось выводить результатов от первого скрипта, выводится кол-во результатов второго. На а потом выводятся результаты только второй темповой таблицы.
Возможно немного запутанно, получилось немного сложная система проверок, но вот так вот реализовал.