[mysql] wyciaganie danych z tabeli na podstawie wartosci


(pain3hp) #1

Proszę o podanie zapytania które wyciągnie wszystkie druzyny które nie posiadają managera, prosze zauważyć że tabela manager nie ma pola w którym ma przypisanie do druzyny ale menadzer takowe ma, defaultowa wartość 0 oznacza brak druzyny. Nie chce dodawać pola do tabeli, szukam sposobu na wyciagniecie takich danych, przy okazji poprosze komentarz jak to sie ma do wydajności, w porównaniu z przypadkiem gdyby owe pole istniało. Dzieki

manager:

+------------+----------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+------------+----------------------+------+-----+---------+----------------+

| id_manager | int(10) unsigned | NO | PRI | NULL | auto_increment |

| first_name | varchar(30) | NO | | NULL | |

| surname | varchar(30) | NO | | NULL | |

| e_mail | varchar(50) | NO | | NULL | |

| password | varchar(40) | NO | | NULL | |

| age | smallint(5) unsigned | YES | | 0 | |

| id_team | int(10) unsigned | YES | | 0 | |

+------------+----------------------+------+-----+---------+----------------+

team:

+------------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+------------+-------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| id_ligi | int(11) | NO | | 0 | |

| id_centrum | int(11) | NO | | 0 | |

| budzet | double | NO | | 0 | |

| team_name | varchar(30) | NO | | NULL | |

+------------+-------------+------+-----+---------+----------------+

(Juszczyk Pawel) #2

IHMO bardzo niepoważny jesteś. Podawanie gotowego kodu jest najgłupszym sposobem (chociaż często tutaj praktykowanym). Chcesz coś osiągnąć to weź się za naukę, a nie proś o naprawdę banalne zapytanie. Jak nie chcę Ci się sprawdzić najprostszej rzeczy to lepiej zostaw mysql i weź się za coś zdecydowanie bardziej na Twoim poziomie.


(GioWDS) #3

Poczytaj o funkcji JOIN.


(Tomek Matz) #4

Pole password nie powinno być typu varchar(40). SHA-256 potrzebuje char(64), a taki SHA-512 char(128). Jeśli nie jest prawdą, że dany menedżer ma zawsze przypisaną drużynę, to pole id_team możesz wywalić i dodać pole id_manager do tabeli team. Dzięki temu będzie widać od razu jakiego menedżera ma dana drużyna. Jeśli drużyna może mieć kilku menedżerów (nie wiem, czy jest to możliwe) to potrzebna jest osobna tabela, żeby odwzorować relację wiele do wielu. Poza tym pole budzet nie powinno być typu double. Nie ma w MySQL innego typu do przechowywania waluty? A może wystarczy sam int (zaraz podrzucę link do ciekawej dyskusji)?

EDIT: Obiecany link http://forum.dobreprogramy.pl/wektory-przyblizenia-t451253-15.html?hilit=decimal#p2858941. Przeczytaj sobie te posty, które zaczynają się od tego wskazanego w linku.


(pain3hp) #5

Skoro jesteś taki dobry to podaj to zapytanie, czy może jesteś kolejnym pseudo programistą wielkim znawcom teorii. Nie wiem gdzie mam to sprawdzić, podaj fraze do googla co byś wrzucił.

@matzu po co komentujesz coś o co nie prosiłem... baza jest przykladowa


(Tomek Matz) #6

OK, już nie będę komentował. Rób po swojemu :slight_smile:


(pain3hp) #7

OK a jak potem sprwadze managerów ktorzy nie maja druzyny? To jest odwracanie kota ogonem. pomyśl.

Przeciez wiem ze moge to zrobić bardziej relacyjnie i powstawiać pola albo stworzyć tabele ktora to zlaczy ale ja chce zobaczyć jak wyciagnac takie dane jak podałem

-- Dodane 27.08.2011 (So) 22:17 --

OK a jak potem sprwadze managerów ktorzy nie maja druzyny? To jest odwracanie kota ogonem. pomyśl.

Przeciez wiem ze moge to zrobić bardziej relacyjnie i powstawiać pola albo stworzyć tabele ktora to zlaczy ale ja chce zobaczyć jak wyciagnac takie dane jak podałem


(Tomek Matz) #8

Jeśli projektujesz bazę danych, to Twoim zadaniem jest jak najlepiej odwzorować rzeczywistość, a nie myśleć zrobię tak i tak, bo będzie mi łatwiej przygotować zapytanie SQL. Zawsze da się zrobić zapytanie SQL (a przynajmniej nie spotkałem przypadku, gdzie się nie dało). Język SQL jest bardzo elastyczny. W Twoim przypadku potrzebujesz użyć tego polecenia LEFT JOIN lub tego RIGHT JOIN (na jedno wyjdzie).


(pain3hp) #9

już mam rozwiązanie i nie potrzeba do tego żadnych JOINów. Jesteście bogami SQLA!!


(Tomek Matz) #10

W każdym zapytaniu SQL, które korzysta z więcej niż jednej tabeli, używasz JOIN-ów. W zależności od tego jakie dane potrzebujesz, używasz innego typu JOIN-a.


(pain3hp) #11

to wyobraź sobie że twoja teza w tym przypadku nie jest trafna. Ja nie widze sqla pierwszy raz na oczy więc nie musisz mi takich rzeczy tłumaczyć...

-- Dodane 27.08.2011 (So) 23:31 --

poza tym zastanów się co piszesz, JOIN łączy dane tabel, więc przeczytaj jeszcze raz ten problem i pomyśl... tu nie ma żadnego łączenia


(Tomek Matz) #12

Ciężka rozmowa :). Zadałeś pytanie (co mnie zaskoczyło, bo wydawało mi się, że nie potrzebujesz moich rad)

W odpowiedzi na to pytanie napisałem, że będziesz musiał użyć LEFT JOIN lub RIGHT JOIN. Podałem nawet link do strony, gdzie masz wyjaśnione jak się używa tych poleceń. Czego jeszcze oczekujesz? Z mojej strony to już koniec dyskusji.


(Juszczyk Pawel) #13

@pain3hp Jestem zawodowym programistą od trzech lat, pracuję m.in. w MySQL. Masz linka

http://dev.mysql.com/doc/

@matzu

SHA1 ma dokładnie 40 znaków


(Tomek Matz) #14

SHA-1 już nie powinno się używać (nie bez powodu wymieniałem różne wariancje SHA-2).

http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html


(pain3hp) #15

@faust1002 ja tez pracuje w tym zawodzie, nie rozumiem po co mi dajesz doca mysqla... Nie jestem idiotą... Czy ty nie rozumiesz że jak sie nie wie z jakiej konstrukcji sqla skorzystać to się nawet nie wie jak ją znaleźć bo zwyczajnie nie wiadomo jakich haseł szukać. Dlatego prosiłem o podanie przykładu i nie po to żeby skopiować i wkleić lecz na jego podstawie dopiero iść na doca i zapamietac. Skoro jesteś zawodowcem to wykaż się jakbyś to zrobił bo narazie owijasz problem w bawełnę...


(Spam) #16

Trzy sposoby na rozwiązanie problemu.

NOT EXISTS:

SELECT team_name

FROM team t

WHERE NOT EXISTS (

   SELECT *

   FROM manager m

   WHERE m.id_team = t.id

);

NOT IN:

SELECT team_name

FROM team

WHERE id NOT IN (

   SELECT id_team

   FROM manager

);

LEFT JOIN:

SELECT team_name

FROM team t

LEFT JOIN manager m

ON m.id_team = t.id

WHERE m.id_team IS NULL;

(Juszczyk Pawel) #17

@pain3hp

Pracujesz w zawodzie? A mnie rozśmieszyłeś. Ciekawe co robisz, pewnie tylko kawę.

nawet nie wie jak ją znaleźć bo zwyczajnie nie wiadomo jakich haseł szukać

Myślałem, że umiejętność nazywania swoich problemów wszystkie dzieci opanowały już w przedszkolu. Dalej musisz na kupę "kaka"? Prosty sposób na rozwiązywanie problemów

  1. Najpierw pomyśl z czym masz problem.

  2. Nazwij problem (po angielsku)

  3. Zapytaj wujka Google.

Zrobilem to, Twój problem to "mysql joining table if key doesn't exists" i ............. hura odpowiedź na pierwszej stronie.

Obstawiam, że zajmujesz się programowaniem stron www. Pamiętaj, że programowanie stron www (szczególnie w PHP) zwykle ma się do programowania jak krzesło do krzesła elektrycznego.

@matzu

Temat który algorytm jest lepszy a który gorszy to materiał na kolejny flame war.


(Tomek Matz) #18

Założyłem, że rozmawiam z osobą, do której przemawiają sensowne argumenty. NIST to jest organizacja, która sprawuje pieczę nad konkursem na nową kryptograficzną funkcję skrótu (SHA-3). Wydaje mi się, że ich opinia powinna znaczyć b. dużo dla każdego developera (nie jest to pierwszy i ostatni raz, gdy się pomyliłem).