Заявка към БД, моля помогнете!

sizif

Registered
Здравейте!

Правя запис в две таблици и има връзка м/у тях.
В първата таблица записвам темата, във втората мненията, автора и датата, така че на един ред от 1-вата таблица може да съответства повече от един ред във втората.

Налага ми се да листвам темите с последното мнение към всяка тема.
Използвам следната заявка:

$query="SELECT tbl1.idf, tbl1.tema, tbl2.data_post, tbl2.mnenie, tbl2.avtor FROM forum tbl1 , forum_post tbl2 WHERE tbl1.idf = tbl2.post ORDER BY tbl1.datalist DESC, tbl2.idp DESC";

Заявката се изпълнява правилно, когато към всяка тема има само едно записано мнение, но когато на една тема съответстват няколко мнения, всичко се разбърква. Опитах да добавя Лимит 0,1 за втората таблица, но заявката не се изпълнява :(

Как трябва да изглежда заявката, за да получавам последното мнение към всяка тема?

Благодаря предварително!

ПП: И още едно питане, може би не е решение, но как става по принцип еднократното включване при листване на цялото съдържание от таблица? Т.е еднократно включване по критерий?
Мисля, че има връзка с въпроса ми :)
Slavei, ако четеш поста ми, имам 1-вата част на книгата, която ми препоръча за БД, но е на 300 км от мен :)
 

jooorooo

Registered
При заявки към две таблици и на мен ми е правило този проблем. Не знам от къде се явява, в системата за новини така бях направил коментарите, но същия проблем като при теб се яви и го направих с две отделни заявки.
 

mute

Registered
така ми е малко трудно да разбера коя за какво е но предполагам
tbl1.idf = tbl2.post са съответно ид на едната и на другата таблица такали е?
това също трябва да е така ORDER BY tbl1.datalist , tbl2.idp DESC.

бтв коя е тази книга която е препоръчал Славеи ?
 

sizif

Registered
Здравейте!

Препоръча ми първата част на "Научете сами SQL".

tbl1.idf = tbl2.post са съответното Ид на едната и маркера по който свързвам съответните редове от втората.
И проблема е, че на един ред (тема) от първата съответстват няколко реда (няколко мнения) във втората, а аз искам едната да се листва изцяло (т.е. листвам темите), а от другата само по един ред от няколко възможни (последното мнение по темата).

Възможно ли е или ще трябва да направя всичко в една таблица?

Не зная как се прави заявка, която да връща само по един ред за няколко повтарящи се условия (редове с еднаква стойност в колона) иначе предполагам, че би могло да стане...

С две отделни заявки означава да вкарам заявките в цикъл:

Проверявам колко полета има в първата таблица и завъртам цикъла толкова пъти, в тялото му две заявки: едната към основната таблица - всеки път по един ред за темата и към втората последния ред където съвпада условието tbl1.idf = tbl2.post, т.е. последното мнение.
Би могло да стане и с два масива, но цикъла с н-брой заявки е по-сигурен...
Във всички случаи ми се ще да има и по-удобен начин :(
 

bafitu

Registered
Здравей,
едва сега зацепих какво искаш и защо няма да стане с лимита :)
единственото нещо което ми хрумва е на принципа на пхпбб.
Които е следния:
в таблицата с темите имаш още едно поле което пр. се казва last_post_id
Така при субмитване записваш коментара в таблицата за коментари, след това правиш 1 ъпдейт на това поле ( last_post_id) в таблицата на темите като това последно id (на коментара) се взима от mysql_insert_id (виж в мануала).
Така ще ти е мнооогоо по-лесно при селект заявката там мисля ,че ще се оправиш.
where tbl1. last_post_id=tbl2.idp (tbl2.idp) мисля ти са ид-тата на коментарите.
Надявам се си ме разбрал горе-долу за какво става въпрос малко объркано ,но.. :)

п.п.
урока за ъплоада май ще почака няколко дена :)
 

sizif

Registered
Здравей!

Да, разбрах те, благодаря! :)

И най-забавното е, че май научих нещо ново. Мисля, че се досещам, какво върши тази функция, която ми препоръчваш - връща ид-то на реда... Видях я в мануала, използва се веднага след операцията...
Досега Ид-то го вземах с нова заявка СЕЛЕКТ веднага селд инсърта и се надявах, че няма да стане объркване :)

Позволявам си още един въпрос: има ли специална заявка, с която да взема определен брой знаци или редове от поле?

Защото иначе вземам целия низ и го деля :(

Благодаря предварително!
 

sizif

Registered
Благодаря ви и на двамата! :)
 

Slavei

Registered
sizif каза:
Здравейте!

Правя запис в две таблици и има връзка м/у тях.
В първата таблица записвам темата, във втората мненията, автора и датата, така че на един ред от 1-вата таблица може да съответства повече от един ред във втората.

Налага ми се да листвам темите с последното мнение към всяка тема.
Използвам следната заявка:

$query="SELECT tbl1.idf, tbl1.tema, tbl2.data_post, tbl2.mnenie, tbl2.avtor FROM forum tbl1 , forum_post tbl2 WHERE tbl1.idf = tbl2.post ORDER BY tbl1.datalist DESC, tbl2.idp DESC";

Заявката се изпълнява правилно, когато към всяка тема има само едно записано мнение, но когато на една тема съответстват няколко мнения, всичко се разбърква. Опитах да добавя Лимит 0,1 за втората таблица, но заявката не се изпълнява :(

Как трябва да изглежда заявката, за да получавам последното мнение към всяка тема?

Благодаря предварително!

ПП: И още едно питане, може би не е решение, но как става по принцип еднократното включване при листване на цялото съдържание от таблица? Т.е еднократно включване по критерий?
Мисля, че има връзка с въпроса ми :)
Slavei, ако четеш поста ми, имам 1-вата част на книгата, която ми препоръча за БД, но е на 300 км от мен :)

Четох те даже няколко пъти, докато си изясня какво искаш да направиш.
Ти хубаво си взел книгата, ама какво прави на майната си...? Като ти е под ръка прочети главата за съединяване или свързване на таблици. Нещо такова трябва да е преведено. Обяснено е много ясно.
Между другото доволен ли си от книгата?
По твоя въпрос не мога да измисля в момента читаво решение. На Бафито предложението май е най-добро.
И между другото кога ще ни покажеш този прослувут вече сайт за имоти? :)

пп
когато свързваш две таблици и няма повтаращи се имена в двете таблици, може да не задаваш таблицата
промерно не "таблицата.името_на_колонката", а само "името_на_колонката" Не знам дали указва влияние на бързодействието, но е по удобно
 

sizif

Registered
Slavei :)

Благодаря за съвета!

Книгата не съм я помирисвал дори :( Поръчах я на сестра ми, сега остава да се сети да ми я прати :(
А имам нужда от повече информация за SQL - то си ми личи...

Иначе сайта за имотите е временно замразен. Чакам дизайна - прави ми го [Pod]Matrix, предполагам, че скоро ще е готов.
Сигурно съм прекроявал таблиците в БД поне 5-6 пъти заради разни претенции и вече взе да не ми пука много-много.
Преди няколко дни като им показвах, каква е идеята за дизайна ме сюрпризираха с нови хрумки ("предишното търсене по градове беше по-добре, можеш ли да го върнеш?", "А тук може ли да се направи едикакво си сортиране?"), казвам им, че ги изпълнявам и затова се бавя, но всъщност не мисля да правя каквото и да било допълнително...
Щом дизайна е готов, събирам отделните части на кода (дано не изскочи проблем) и ги пращам да плуват. Убиха ми целия ентусиазъм... А като си помисля, че четях за СЕО :(

Питането ми за заявката е заради един форум, който правя за локалната мрежа на моя доставчик. Обещал съм го от два месеца и едва сега ми остава време (а и се чувствам достатъчно уверен), за да се пробвам... Пък и имам една идея от доста време, може и на мен да ми послужи :)

Може би ще задам няколко въпрса за кукиис тия дни (надявам се да не запецна, доста материали имам за тях). Не се сещам за друг начин, по който мога да определям кои от новите теми са четени и кои не... Макар че както винаги съм отврен за идеи :)
 

sizif

Registered
Здравейте!

Успях с листването на последното мнение. Не успях обаче да се справя с включването на SUBSTR(mnenie,1,5); :(

Ето заявката, в която се опитах да го инкорпорирам:

$query="SELECT idf, tema, data_post, avtor, SUBSTR(mnenie,1,5) FROM forum, forum_post WHERE last_post=idp ORDER BY datalist DESC";

Заявката се изпълнява, но не взема нито знак от "мнение", макар че има по-дълъг низ от указаното :(

Възможно ли е включването на SUBSTR(mnenie,1,5); в общия селект?

Преди това използвах substr(); на РНР в уаил-цикъла, с който обхождах резултата от заявката, за да взема нужната ми част от "мнение" (селектирано изцяло), което ме води към един стар въпрос:

Възможно ли е две самостоятелни заявки да ми върнат общ масив, който да обходя? ;)

Благодаря за отговорите!
 

bafitu

Registered
мм работи си да...
Явно някъде бъркаш.Пробвай да им сложиш tbl1... tbl2 .. незнам.
Даже сега пак го пробвах да не греша някъде аз ,но не работи си..
Нямам идея защо не ти работи при теб.
 

sizif

Registered
Здравей, bafitu :)

Не съм казал, че заявката не се изпълнява изобщо, а че при изпълнение изобщо не листва "мнение" :(

Иначе в такива случаи първата ми работа е да проверя за правописни грешки в имена на променливи и пр...
Първоначално беше с тбл1. и тбл2, но резултата беше същия. махнах ги защото реших, че с тези таблици имам по-голям шанс да объркам - все пак правя нещо ново и опростих конструкцията...

Листва всичко друго и даже уорнинг не ми дава (ако разминаването е в РНР), но от "мнение" - нито знак...

По-късно:
Някакви идеи къде греша?
 

Горе