[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: оптимизация вредного запроса
agentor
уважаемые программисты..многое перепробовал но хотелось бы узнать можно ли каким нибудь образом оптимизировать данный запрос? через LEFT JOIN или каим нибудь другими способами. в LEFT JOIN к сожалению не силён
дело в том что он выполняет 16 Запросов из базы данный при выводимых 6 записей, и чем больше записей , тем больше становитсся и запросов ну и тем самым нагрузка.
при каждом добавлении новой записи добовляет ещё 3 дополнительных запроса..
прошу помощи, финансово отблагодарю...

PHP
$query "select * from school where userId=".sqlesc($b["id"])." order by id";
$r do_mysql_query($query) or die("Eror 1");
print(
"<tbody>");
for(
$i=0;$i<mysql_num_rows($r);$i++)
{
$rowS mysql_fetch_row($r);
$query "select schoolNum,cityId from schoolNum where id= ".sqlesc($rowS[3])."";
$r1 do_mysql_query($query) or die("1");
$rowS1 mysql_fetch_row($r1);

$query "select city from city where id= ".sqlesc($rowS1[1])."";
$r2 do_mysql_query($query) or die("2");
$rowS2 mysql_fetch_row($r2);
$query "select count(*) from school where schoolNum = ".sqlesc($rowS[3])." and schoolCountry = ".sqlesc($rowS[5])." and schoolRegion = ".sqlesc($rowS[6])." and schoolCity = ".sqlesc($rowS[7])."";
$r3 do_mysql_query($query) or die("õ");
$rowS3 mysql_fetch_row($r3);
print(
"<tr>
<td><a href=index.php?d=searchmitglieder&sn="
.$rowS[3]."&u=".$b["id"].">".$rowS1[0]." / ".$rowS2[0]."</a></td>");
print(
"<td align=center>".$rowS[8]." - ".$rowS[2]."</td>");
print(
"<td align=center>".$rowS3[0]."</td>");
}




Спустя 40 минут, 27 секунд (9.05.2009 - 12:52) jetistyum написал(а):
дай расклад по полям таблицы. это конечно не гуд - то что у тебя написано smile.gif
Сджойним... smile.gif

Спустя 3 часа, 39 минут, 49 секунд (9.05.2009 - 16:31) agentor написал(а):
переделал полностю что бы было видно поля таблиц..
если я правильно понял вопрос....

PHP
if($CURUSER["id"] == $b["id"]){
print(
"<th scope=\"col\">Config</th>");
}
print(
"</tr></thead>");
$r = mysql_query("select * from school where userId=".sqlesc($b["id"])." order by id") or die("Eror 1");
print(
"<tbody>");
for(
$i=0; $i< mysql_num_rows($r);$i++)
{
$rowS = mysql_fetch_array($r);

$r1 mysql_query("select schoolNum,cityId from schoolNum where id= ".sqlesc($rowS["schoolNum"])."") or die("1");
$rowS1 mysql_fetch_assoc($r1);


$r2 = mysql_query("select city from city where id= ".sqlesc($rowS1["cityId"])."") or die("2");
$rowS2 = mysql_fetch_assoc($r2);

$r3 = mysql_query("select count(*) from school where schoolNum = ".sqlesc($rowS["schoolNum"])." and schoolCountry = ".sqlesc($rowS["schoolCountry"])." and schoolRegion = ".sqlesc($rowS["schoolRegion"])." and schoolCity = ".sqlesc($rowS["schoolCity"])."") or die("õ");
$rowS3 = mysql_fetch_array($r3);
$count = $rowS3[0];

print(
"<tr>
<td><a href=index.php?d=searchmitglieder&sn="
.$rowS["schoolNum"]."&u=".$b["id"].">".$rowS1["schoolNum"]." / ".$rowS2["city"]."</a></td>");
print(
"<td align=center>".$rowS["schoolYearIn"]." - ".$rowS["schoolYear"]."</td>");
print(
"<td align=center>".$count."</td>");
if(
$CURUSER["id"] == $b["id"])
print(
"<td align=\"center\">
<a href="
.genURL('editdata-&sid='.urlencode($rowS["id"]).'/','index.php?d=editdata&sid='.urlencode($rowS["id"])).">Korrigieren</a>
</td>"
);
print(
"</tr>");
}


$b["id"] = id юзера из базы данных user ( профиль юзера)
$CURUSER["id"] = глобальный ид юзера

Спустя 48 минут, 15 секунд (9.05.2009 - 17:20) jetistyum написал(а):
тебе нужно было просто названия полей написать....


первые три запроса можно обьединить в такой вот запрос
SQL
SELECT `s`.*, `sn`.`schoolNum`, `sn`.`cityId`, `c`.`city` FROM `school` AS `s`

LEFT JOIN `schoolNum` AS `sn`
ON `sn`.`id` = `s`.`schoolNum`

LEFT JOIN `city` AS `c`
ON `c`.`id` = `sn`.`cityId`

WHERE `school`.`userID` = ".sqlesc($b["id"])." ORDER BY `id`


Четвертый тоже можно по-идее, но я пока затрудняюсь сказать как.. sad.gif...
выложи описание таблиц...

Спустя 6 минут, 24 секунды (9.05.2009 - 17:26) jetistyum написал(а):
и еще, ты не правильно хранишь данные.. в таблице school не должно быть user_id
связь

школы - люди
должна быть как
однин - ко многим


не имеет смысла дублировать записи....


в таблице школы - заполняешь уникальные школы..
например


school_id, school_city_id, school_name, school_number


при чем school_id это не номер школы, а auto_increment primary key поле
и любую другую информацию по школам...

создаешь таблицу юзеров


user_id, user_name, school_id

и все.. таким образом ты поставишь в school_id id школы... и по этому id ты всегда найдешь школу.. а для того чтобы найти всех юзеров школы, ты ищешь
seleect * from users where users.school_id = 58

Ещё раз повторюсь - номер школы отдельно, id школы - отдельно...
т.к. номера школы могут совпадать, а id - уникальное поле.


Спустя 2 минуты, 46 секунд (9.05.2009 - 17:29) jetistyum написал(а):
и называй поля в таблицах правильно
не делай поля name, id
а делай
user_name в таблице users
school_name в таблице schools
city_name в таблице cities
название таблицы - сущ. множ. число, название полей - ед. число сущности и название поля

users - user_id
schools - school_id
bastards - bastard_name

если в таблице users ты хочешь сделать поле - id школы, оно должно быть такое же, как в таблице schools - тоесть school_id

user_id, user_name, school_id

тогда не возникает вопроса где какое поле... и форейджн кей какой таблицы это поле.

Спустя 3 часа, 17 минут, 28 секунд (9.05.2009 - 20:46) agentor написал(а):
вот залил скрины базы на рапиду что бы янсее было видно.
http://rapidshare.com/files/231055330/names.rar.html

Цитата
и еще, ты не правильно хранишь данные.. в таблице school не должно быть user_id
связь


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

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

Спустя 3 часа, 22 минуты, 42 секунды (10.05.2009 - 00:09) jetistyum написал(а):
ну я тоже самоучка, и программированием занимаюсь где-то года 3, но вплотную... сейчас же достаточно материалов для изучения чего угодно.... так что, просто читай книги.... тренируйся, пытайся..

Цитата

мне нужно было знать принадлежность к каждой школе...поэтому такую базу и сделал..

если связь многое - ко многим, то всеравно можно сделать таблицу
школ, таблицу юзеров, и связующую таблицу... всего на два поля school_id, user_id и не дублировать каждый раз данные о месторасположении школы.. и.т.д.
Советую вплотную заняться рефакторингом.... Это позволит нормализовать структуру данных, уменьшит количество запросов, и уменьшит вес базы данных...




а вот этот запрос
Цитата

select count(*) from school where schoolNum = ".sqlesc($rowS["schoolNum"])." and schoolCountry = ".sqlesc($rowS["schoolCountry"])." and schoolRegion = ".sqlesc($rowS["schoolRegion"])." and schoolCity = ".sqlesc($rowS["schoolCity"])."


мне просто логически непонятен
подсчитать кол-во школ с одним и тем же номером, в одном и том же городе, одной и той же страны и региона.
а как их может быть больше одной????
две школы номер 6 в городе Москва? разве может быть такое? Или нумерация идет по разным районам одного города????
С рапиды стянуть не могу пока.. кто-то что-то тянет в моей сетке...


Спустя 1 день, 21 час, 50 минут, 25 секунд (11.05.2009 - 21:59) agentor написал(а):
что то ругается на
PHP
Data Error!
Unknown column 'school.userId' in 'where clause'

Спустя 14 минут, 43 секунды (11.05.2009 - 22:14) jetistyum написал(а):
Ну ... запрос делался с твоего запроса..
SQL
select * from school where userId=....


чтобы понять ошибку - просто переведи ее smile.gif

Спустя 10 часов, 7 минут, 47 секунд (12.05.2009 - 08:22) agentor написал(а):
Skreen FOTO Mysql

вроде работает, за исключением последнего запроса.
минусы:$rowS["schoolNum"]." стало выводить не ид а название в ссылке, что при переходе по ссылке на страницу поиска по название не срабатывает, делал ид но выводит совсем не то что нужно(левый ид выводит) .делал по ORDER by schoolNum но выводит тож не верно
мне нужно я думаю уникальный ИД самой школы, т.к по ней срабатывет поиск при переходе с данной странице
и как можно сопоставить последний запрос?

Спустя 8 часов, 10 минут, 48 секунд (12.05.2009 - 16:33) glock18 написал(а):
2agentor:

jetistyum прав: "это конечно не гуд - то что у тебя написано".

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

Замечание: НИКОГДА! Не вставлять запросы внутрь цикла! Правило: сначала в цикле формируешь сложный запрос, а потом выполняешь его. Хотя, конечно здесь это излишне - запрос отнюдь не сложный.

Если я правильно понял твою задачу, то она решается в один запрос без проблем.
3 запрос в цикле я тоже не осознал.

jetistyum привел как раз то, что тебе нужно. Хотя order by id там, очевидно, не в тему и лучше там использовать JOIN, а не LEFT JOIN.

Еще одно: вместо * в запросе, особенно, если в нем есть JOIN'ы пиши конкретные поля, которые тебе нужны.

Вся эта задача делается одним запросом вне зависимости от количества записей.
Советую переписать все это нафик, взяв за основу предложенный запрос.

Спустя 5 часов, 21 минута, 33 секунды (12.05.2009 - 21:54) agentor написал(а):
да я уже всё перепробовал...ну незнаю я как их вместе собрать в один запрос и с джойнить что бы получилось то что мне нужно..
и вобще я думаю будет легче оставить 1 запрос и не трогать а последние 3 джойнить..

помоги плиз если есть навыки и опыт..
мне нужно выдернут 2 уникальных Ид из баз, один из Школы, FROM `school` ,FROM`schoolNum` другой из названий шол.
вот один вроде есть а второго нету..также вобще категорически непонятна как ещё и коунт из каждой школы которая находится в (одной стране,одном городе,и.т.д) выдернуть
я так думаю мне с ней придётся вечно мучатся

Спустя 10 часов, 42 минуты, 8 секунд (13.05.2009 - 08:36) glock18 написал(а):
опиши понятно задание. тогда может подумаю. а вообще, тебе уже, по-моему, дали достаточно чтобы родить решение;)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.