Код, раскидывающий результаты одной таблицы в другие по признаку

  • Автор темы BeatBox
  • Дата начала

BeatBox

Guest
незнаю, тольи я тупой толи просто нужно посидеть и вчитаться, но по ссылке http://dev.mysql.com/doc/mysql/ru/join.html вообще ничего непонятно.. буду мучаться :)
 

BeatBox

Guest
а я вроде понял. просто мне легче понимать что-либо на примере. допустим
select a.blabla1, a.blabla2, n.blaba59 FROM tabble_one AS a, table_two AS n и так далее, - выведет мне данные blabla1, blabla2 из таблицы tabble_one, а blaba59 из таблицы table_two? я правильно понял?
 

CDParker

Guest
А что в моём коде не так, только $update нада переименовать на $update1 $update2 и $update3.Всё остальное должно работать.

Блин, может я плохо понимаю. Но среднее значение ЧЕГО и КУДА тебе нужно прописать ?
 

BeatBox

Guest
CDParker уже впринципе если я правильно разобрался с обьеденениями, то и разброс ненужен ;)
 

uchenik

Новичок
Допустим в первая таблица выглядит так:

column_1
a
b
c

а вторая таблица так:

column_2
1
2
3

Тогда запрос "select a.column_1, b.column_2 FROM tabble_one AS a, table_two AS b

вернет такой массив:

a 1
a 2
a 3
b 1
b 2
b 3
c 1
c 2
c 3

Это называется "полным обьединением", при котором каждая строка таблицы table_one будет соответствовать каждой строке table_two.

Обьединения бывают разными. Что они делают и как ими пользоватся прекрасно описано на примерах в книге Дюбуа, перепечатывать которую нет смысла. Скажу что обьединения упростят твою систему раз в 10.

Поэтому снова рекомендую купить книжку, потому что на документации по-моему невозможно научится. Это справочник, но не более.
 

BeatBox

Guest
А неподскажете, почему мне код:

PHP:
$resultc = $db->sql_query("SELECT a.pid as pid, a.title as title, b.vote_mark as vote_mark FROM ".$prefix."_pages a, ".$prefix."_vote b WHERE a.game_id=b.vote_id order by $sortby $stype limit 0, 50");
while ($row = $db->sql_fetchrow($resultc)) {
$vm = intval($row['vote_mark']);
$pid = intval($row['pid']);
выводит не по 1-му разу каждое значение, а раз 50 одно и то же?
 

BeatBox

Guest
uchenik
тоесть? я непонял Вас (простите).
Мне их нужно переименовать?
 

uchenik

Новичок
Непонятно зачем здесь функция intval() ?

-~{}~ 07.03.05 00:58:

BeatBox

$vm = intval($row['vote_mark']);
$pid = intval($row['pid']);

Смысл этих строк? Что они должны делать?
 

BeatBox

Guest
uchenik
я честно говоря незнаю. Я все скрипты делаю по примеру из других.
Если вам несложно - скажите что нужно исправить?
вообще этот код (выше) выводит последние добавления в раздел.
$pid - это ссылка на старницу
$vm - это результат голосования за статью
 

uchenik

Новичок
ааа, теперь понятно.

Рекомендую писать программы самостоятельно. Когда возникающие проблемы придется решать самому - быстрее научишся программировать.

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

Иначе никак.

-~{}~ 07.03.05 01:12:

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

BeatBox

Guest
ну я php-nuke редактирую, думаю многие о нем знают :)
пс
если я из того кода убираю все связи к другой таблице (b.vote_mark ) то все онрмально - отобажаються последжние 5 добавленных материалов..
 

SelenIT

IT-лунатик :)
BeatBox

вообще-то в тех строчках, которые ты привел, никакого "вывода" не видно. Выборка есть, присвоение чему-то ее результата - тоже, а вывод явно остался "за кадром".

А результаты повторяются скорее всего потому, что поле vote_id в таблице голосований не уникальное. И тебе выводятся все сочетания каждой строчки из таблицы статей с голосом каждого юзера по данной статье.

Используй группировку по этому полю - как в том примере, что я тебе уже показывал. Тем более, как я понимаю, тебе все равно придется рассчитывать среднее значение рейтинга:

[sql]SELECT a.pid as pid, a.title as title, AVG(b.vote_mark) as vote_mark FROM ".$prefix."_pages a, ".$prefix."_vote b WHERE a.game_id=b.vote_id GROUP BY b.vote_id order by $sortby $stype limit 0, 50[/sql]
 

BeatBox

Guest
Народ, может лучше все-таки я сделаю как сразу хотел? УЖе мне код дали, только нужно немного подправить:
PHP:
$take=mysql_query("SELECT vote_id, vote_mark FROM nuke_vote");
while($row=mysql_fetch_assoc($take)) {
$vote_id=$row['vote_id'];
$vote_mark =$row['percent'];
$update=mysql_query("UPDATE nuke_games SET igm='$vote_mark' WHERE game_id='$vote_id'");
echo "<br>Данные для  vote_id=$vote_id занесены в nuke_test1";
}
нужно что бы этот код не вставлял мне несколько раз одно и то же значение в БД в одно поле (каждый раз перезаписывая) а вставлял среднее. я пытался сделать SELECT vote_id, AVG(vote_mark) но почему-то неполучаеться.
 

SelenIT

IT-лунатик :)
BeatBox
Лучше доведи до ума правильный вариант. Подправленый вариант запроса для твоего примера с объединением я уже выложил.

А в твоем последнем примере ничего не получается потому, что в результате выборки нет поля с именем 'percent', а значит, нет элемента с таким ключом в массиве $row.
 

BeatBox

Guest
SelenIT
правильный вариант до ума недоведу, так как уже 5 часов сижу, и мягко говоря болит задница.. сижу и глупо ничего не дела полезного, только матербсь тихо про себя.... уже б давно что-т более нужное сделал :) а такой вариант тоже не работает :( :

$take=mysql_query("SELECT vote_id, AVG(vote_mark) as percent FROM nuke_vote");
while($row=mysql_fetch_assoc($take)) {
$vote_id=$row['vote_id'];
$vote_mark =$row['percent'];
$update=mysql_query("UPDATE nuke_games SET igm='$vote_mark' WHERE game_id='$vote_id'");
echo "<br>&#196;&#224;&#237;&#237;&#251;&#229; &#228;&#235;&#255; vote_id=$vote_id &#231;&#224;&#237;&#229;&#241;&#229;&#237;&#251; &#226; nuke_test1";
}
 

SelenIT

IT-лунатик :)
BeatBox
Ты заблуждаешься. Правильный вариант можно довести до ума в принципе. Кривой же вариант по определению работать не обязан, а ведь даже в лучшем случае тебе пришлось бы клонировать эту кривизну - для остальных таблиц.

Как это ничего полезного? Ты ведь только что впервые попробовал работать с объединениями и группировками в SQL-запросах. Осталось всего ничего - использовать и то, и другое одновременно. Но ведь по частям получалось - получится и целиком!

Успокойся, перестань метаться, соберись, посмотри на мой позапрошлый постинг. А если совсем устал - ляг поспи, утро вечера мудренее. Не нужно пороть горячку.
 

BeatBox

Guest
сайт к среде должен быть сделан :) спокойсвием я точно не отличусь в ближайшие два дня :)
 

SelenIT

IT-лунатик :)
Стресс и раздражение не способствуют эффективности решения задач - по себе знаю. Так что отдых бывает просто необходим, особенно когда что-то всерьез не ладится.

И все-таки попробуй свой вариант с объединением вот в таком виде:
PHP:
$resultc = $db->sql_query("SELECT a.pid as pid, a.title as title, AVG(b.vote_mark) as vote_mark FROM ".$prefix."_pages a, ".$prefix."_vote b WHERE a.game_id=b.vote_id GROUP BY b.vote_id order by $sortby $stype limit 0, 50");
while ($row = $db->sql_fetchrow($resultc)) {
$vm = intval($row['vote_mark']);
$pid = intval($row['pid']);
// и далее по тексту...
 
Сверху