MySQL vapros

19 отговора 449 прегледа
#1

MySQL vapros

imam tablica sas, grubo kazano, slednata stuktura:
id
caption
parent
.... i drugi, koito ne sa ot znachenie
iskam da izkaram vsichki elementi, vkliuchitelno s tehnite podchineni, ako imat takiva... ama neshto ne moga da go dokaram... kato ia left joina sas sebe si na miastoto na tezi elementi, koito niamat podchineni, poluchavam redove samo s Null. Neshto mai gresha pri query-to, no ne moga da zagreia kude...

Отговор
в отговор на toranaga #2

Re: MySQL vapros

Дай заявката :)

Естествено е да получаваш NULL щото то точно това му е целта на LEFT JOIN

Ако обаче искаш да изкараш йерархично всички подчинени надолу няма да стане освен ако нямаш фиксиран брой нива на йерархията. Щото при неограничен брой ти трябва рекурсия (това всъщност е дървовидна структура) а рекурсията и SQL са малко скарани меко казано.

На всичко отгоре е важно какво всъщност ти е отношението.

Едно към Едно
Едно къв Много
Много към Едно
Много към Много

Трабва внимателно дефинираш точно една от тези зависимости и да се погрижиш данните да не я нарушават за да могат заявките да разчитат на нея.

salle.online.bg/sig
Отговор
в отговор на salle #3

Re: допълнение

при такава таблица

id, parent

е много по-лесно да направиш справка за "родителите на даден ID" отколкото за "децата на даден родител"

Иначе казано за второто по-добра работа ти върши таблица

id, child

т.е. обратен указател.

Забележи, че ако връзката ти е едно към едно т.е. един родител има само едно дете и едно дете има само един родител най-добра работа ще ти свърши "претрупана" таблица:

id, parent, child

А пък ако ще си говорим за хора и генеалогично дърво там естествената структура е:

id, mother, father

и така нататък

salle.online.bg/sig
Отговор
в отговор на salle #4

Re: MySQL vapros

Ха, мерси за отговора. Точно на теб се надявах :)
Значи... моя случай е по-простичък...
искам да извадя инфо само за две нива
връзката ми е едно към много - всеки елемент има само един родител
заявката ми е следната:
select * from navmain n1
left join navmain n2 on n1.id=n2.parent
там където няма с какво да се "left join-e " получавам Null за ВСИЧКИ полета от резултата - е това не разбирам - не трявба ли да получа parentite, а там където няма поделементи да има Null до тях?

Отговор
в отговор на toranaga #5

Re: MySQL vapros

за ВСИЧКИ полета от резултата ??

т.е. Цял ред с NULL ??

salle.online.bg/sig
Отговор
в отговор на salle #6

Re: MySQL vapros

imenno! tova me porazi i mi razbi predstavite za left join
neshto poveche -
ako smenia select * sas select n1.* - vsichko izliza - e, ne vizhdam podelementite
ako iskam select n1.*,n2.caption - togava caption mi stava null kudeto i caption na podelementa e Null

Отговор
в отговор на toranaga #7

Re: MySQL vapros

Ама естествено !!

Всички колонки от "дясната" таблица стават NULL

Нали точно това е целта на LEFT JOIN

И точно затова ако искаш само редовете за които няма Child можеш да напишеш:

select n1.* from n1 from navmain n1
left join navmain n2 on n1.id=n2.parent WHERE n2.parent IS NULL;

с други думи можеш във WHERE клаузата да проверяваш за NULL която и да е колонка

Иначе казано това е учебникарския пример защо не ти трябва sub-query за:

select .... from tbl1 where ID NOT IN (select ID from tbl2);

salle.online.bg/sig<P ID=&quot;edit&quot;><FONT class=&quot;small&quot;><EM>Редактирано от salle на 07.08.02 13:53.</em></font></p>

Редактирано от salle на

Отговор
в отговор на salle #8

Re: MySQL vapros

От "дясната" естествено, че стават Null.
Ама не разбирам защо колонките И В ЛЯВАТА стават Null!!! Когато left join-vam ралични таблици и в дясната нямам съответствие от ляво са си записите, а отдясно става Null, ОК!
Но в моя случай не се получава така!
Целта ми е да изкарам ЕДНОВРЕМЕННО тези които имат и тези които нямат поделементи. Има ли начин за това?

Отговор
в отговор на salle #9

Re: MySQL vapros

Хааа, по дяволите, открих го - някакъв бъг ще да е - като качих същата таблица със същата заявка под Linux сървъра, проблема изчезна - Null има само "отдясно", както и би трябвало.....
MySQL-a ми е 3.23.46-nt под NT4 SP6a - ще ъпгрейдна и ще кажа какво е станало.
Sorry за недоразумението и благодаря много за помощта!

Отговор
в отговор на toranaga #10

Re: MySQL vapros

Това не го бях чувал досега. Пробвай с 3.23.51 и ако пак се появява ми се обади.

Преди това обаче си запази оригиналните таблици и пробвай myisamchk или REPAIR TABLE

Подобни ефекти се получават понякога при повредени инедкси.

salle.online.bg/sig
Отговор
в отговор на salle #11

Re: MySQL vapros

Уфффф, сложих по-висока версия - 3.23.51.... пак не става.... с други думи, под линукс е ОК, под NT - същата боза.
Проверявах и таблиците... никакъв ефект - пък и то имам 15 записа на кръст...
за всеки случах си напрвих аналогичен пример в друга таблица... същата работа....

Отговор
в отговор на salle #12

MYSQL-a e OK, imaite edno naum za PhpMyAdmin-a

okazva se che s mysql-a vsichko si e nared... problema e v phpmyadmin-a deto go polzvam.... toi izkarva Null, niamam predstava zashto... inache rezultata si e OK.

Отговор
в отговор на toranaga #13

Re: MySQL vapros

сега остава да си изкопираш таблиците и на друг Win сървър и да повториш същия ефект...


Имам следното предложение:

1. Изкопирай таблиците във друга база данни само, че с mysqldump за да е сигурно, че няма нищо общо с файловете.
2. Пробвай същата заявка в новата база.
3. Ако ефектът продължава ми изпрати един email с dump-а на таблиците, заявката и резултата.

Ако не вече си си решил проблема

salle.online.bg/sig
Отговор
в отговор на salle #14

Re: MySQL vapros

vsichko si e OK, pogledni dolnoto mnenie

И благодаря още веднъж за помощта!

Редактирано от toranaga на

Отговор
в отговор на toranaga #15

Re: :)

Видях

salle.online.bg/sig
Отговор
в отговор на toranaga #16

Re: MySQL vapros

Abe kak taka stava LEFT JOIN na tablica sys samata sebe si, a3 mi triabvashe tova oba4e ne stava - naloji mi se da si napravia niakoi mi3erii na tablicite. T.e. triabvashe tam kydeto triabva da e NULL da slagam niakakvi bogus stojnosti koito da si syvpadat.

[линк]
Отговор
в отговор на MartinT #17

Re: MySQL vapros

mi eto ti query-to:
select * from navmain n1
left join navmain n2 on n1.id=n2.parent - vsichko si stava OK

Paradoksalnoto v sluchaia e che edna i sushta versia na phpmyadmin - 2.2.6 pokazva razlichni resultati pod windows NT i linux. Taka che ako si po Win, za vseki skuchai probvai deistvai s drugo GUI, da si suguren kakvo poluchavash...
Procheti cialata tema za podrobnosti

Отговор
в отговор на toranaga #18

Re: MYSQL-a e OK, imaite edno naum za PhpMyAdmin-a

mi obarkva se, kato vzima rezultata ot mysql, i napravi fetch_row, stoinostite ot liavata tablitza zamestvat stoinostite ot diasnata, zashtoto sa sas sahtia key v asotziativnia masiv

vsichko shte e nared, ako kazez select n1.a as a1, ... n2.a as a2...

Отговор
в отговор на gonzales #19

Re: MYSQL-a e OK, imaite edno naum za PhpMyAdmin-a

hmmm, edva li shte dopusnat takava balamska greshka... puk i phpmyadmina se spravia dosta dobre v drugi sluchai kogato ima ednakvi assoc kliuchove. Strannoto e che sushtoto neshto pod unix raboti pravilno

Отговор
в отговор на toranaga #20

Re: MYSQL-a e OK, imaite edno naum za PhpMyAdmin-a

mi ne znam, prosto mi hrumna che moze da se sluchva taka...

Отговор