Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] SELECT i bardzo dużo kolumn
Forum PHP.pl > Forum > Bazy danych
Dycu
Mam następujący problem. Powiedzmy, że posiadam dwie tabele, w jednej znajduje się id_uzytkownika i ok. 200 kolumn zawierających dane liczbowe odnośnie jakiegoś pomiaru przeprowadzonego przez tego użytkownika. Druga tabela zawiera id i nazwę tego użytkownika:

1 Tabela:
id
id_uzytkownika
wartosc1
wartosc2
...
wartosc200

2 Tabela:
id_uzytkownika
nick

Chciałbym teraz wyciągnąć dane z pierwszej tabeli, ale zamiast id_uzytkownika włożyć w to miejsce nick użytkownika. Wyszukałem, że takie rzeczy robi się za pomocą SELECT'a z zastosowaniem "as" do odnoszenia się do odpowiednich kolumn. Niestety przy tej ilości kolumn jeśli miałbym każdą z nich osobno adresować to chyba bym się zapisał na śmierć smile.gif. Czy są jakieś metody na np. wyciąganie wszystkich kolumn oprócz skończonej ilości? Bądź jakiś inny sposób aby to przeprowadzić (z poziomu mysql)?
Shili
Prawdę mówiąc nie widzę sensu takiego rozdrobnienia. No chyba, że jeden użytkownik może mieć wiele nicków do jednego id, albo użytkownik o danym nicku może mieć wiele swoich id.

  1. SELECT * FROM pomiar, nick WHERE nick.id_uzytkonika = pomiar.id_uzytkownika
Dycu
Wygodniej mi przechowywać samo id w tej tabeli jak i innych niż za każdym razem nick.

To co podałeś nie rozwiązuje mojego problemu, gdyż potrzebuję, żeby kolumna z nickami zastąpiła kolumnę z id, a nie została dołączona na koniec. Bo potem muszę za pomocą php odpowiednio martwić się o wyświetlanie, a tak zrzuciłbym to na odpowiednie zapytanie. Mam nadzieję, że teraz jest w miarę jasne o co mi chodzi.
Shili
Podałaś.

Cytat
Wygodniej mi przechowywać samo id w tej tabeli jak i innych niż za każdym razem nick.
Ok, teraz rozumiem winksmiley.jpg

Zawsze możesz stworzyć sobie widok, który wybierze Ci nick i wszystkie 200 wartości (sporo zachodu). Chyba że znowu czegoś nie rozumiem odnośnie zastąpienia. Chcesz mieć tylko te 200 prób i jeden nick, tak? Jeśli tak, to w czym przeszkadza (jeśli transfer, to ok) wybranie również identyfikatorów? Możesz się odwoływać do 200 wartości i do nicka, a resztę zostawić w spokoju.
Dycu
Cytat
Podałaś.


Przepraszam.

Cytat
Zawsze możesz stworzyć sobie widok, który wybierze Ci nick i wszystkie 200 wartości (sporo zachodu). Chyba że znowu czegoś nie rozumiem odnośnie zastąpienia. Chcesz mieć tylko te 200 prób i jeden nick, tak? Jeśli tak, to w czym przeszkadza (jeśli transfer, to ok) wybranie również identyfikatorów? Możesz się odwoływać do 200 wartości i do nicka, a resztę zostawić w spokoju.


Więc problem jest taki, że potem w pętli wrzucam te dane do <table> i muszę się martwić, aby w odpowiednie miejsce wrzucić zamiast id, nick. Niby mały problem, ale przy tej ilości danych robi się to nieprzyjemne. Dlatego wolałbym wyciągać dane z bazy już w takiej formie w jakiej potem chcę je wyświetlać.
Shili
Polecam w takim razie jeszcze raz widoki.
sowiq
Dycu, podczas wyświetlania stosujesz tablicę asocjacyjną, czy numeryczną? Bo jeżeli asocjacyjną, to ja nie wiem o co Ci chodzi.

Skoro masz tablicę np.
Kod
$row['a'], $row['b'], $row['c']
, to co Cię podczas drukowania jej elementów obchodzi, czy na jej końcu jest jakieś $row['xyz'] ?
Dycu
Tablicę numeryczną, gdyż nie zamierzam się odwoływać do każdego elementu po nazwie (przy 200 elementach w linii to jednak problem), a tak lecę zwykłą pętlą. A jeśli kolejność jest zachwiana, to muszę się martwić tym, żeby zamiast id wrzucać w dane miejsce nick z ostatniej kolumny.

Wydaje mi się, że te widowki to rozwiązanie mojego problemu, muszę się tylko pobawić w stworzenie odpowiedniego smile.gif.

Niestety muszę odświeżyć pytanie.

Skonstruowałem coś takiego:
Cytat
CREATE VIEW ReturnData
(id,nazwa,symbol,nazwaZespolu,
200 kolumn danych)
AS
SELECT id, nazwa, symbol, nazwaZespolu,
200 kolumn danych
FROM (
SELECT * FROM Wroclaw
LEFT JOIN Zaklady ON Wroclaw.zaklad_id = Zaklady.idZ
LEFT JOIN Urzadzenia ON Wroclaw.urzadzenie_id = Urzadzenia.idU
) AS t;


Czyli chciałem najpierw połączyć 3 tabele, a potem z tego wybrać i ustawić w odpowiedniej kolejności interesujące mnie dane. I jak się okazuje mysql nie pozwala na SELECT'y w podzapytaniach, więc znów jestem w lesie smile.gif. Bo nie widzę innego sposobu na pobranie tego tak jak potrzebuję. Jakieś pomysły czy zostać przy ustawianiu kolumn w odpowiedniej kolejności już w php?
sowiq
Cytat(Dycu @ 17.07.2008, 17:08:00 ) *
a tak lecę zwykłą pętlą.

Yhym. Mówisz, masz:

  1. <?php
  2. // $row - tablica asocjacyjna
  3. foreach($row as $id => $v){
  4. if($id != "login") // login - nazwa kolumny z loginem
  5. echo "Pomiar: ".$id.". Wynik: ".$v."<br>\n";
  6. }
  7. ?>


Voila' :]


[edit]
Aha, jeszcze jedno. Z doświadczenia wiem, że od
Kod
SELECT * FORM `table1`, `table2` WHERE `table1`.`t1_id` = `table2`.`t2_id` AND `table1`.`t1_id` > 100

wydajniej jest użyć:
Kod
SELECT * FROM `table1`
    LEFT JOIN `table2` ON `table1`.`t1_id` = `table2`.`t2_id`
    WHERE `table1`.`t1_id` > 100


Sposób taki daje nie tylko większą szybkość działania, ale i przejrzystość kodu, jeśli łączysz więcej tabel.
http://dev.mysql.com/doc/refman/5.0/en/lef...timization.html
miskorz
Kwestia optymalizacji zapytania swoją drogą... ale po co aż widok?? sciana.gif
W kwestii przypomnienia... gwiazdkę po SELECT można zastąpić wyspecyfikowanymi nazwami kolumn, które chcemy mieć w wyniku wstydnis.gif czyli przykładowo

SELECT pomiar.id,nick.nick,pomiar.pomiar1,....,pomiar.pomiar200
FROM pomiar, nick
WHERE nick.id_uzytkownika = pomiar.id_uzytkownika;
sowiq
Cytat(miskorz @ 17.07.2008, 23:09:44 ) *
Kwestia optymalizacji zapytania swoją drogą... ale po co aż widok?? sciana.gif
W kwestii przypomnienia... gwiazdkę po SELECT można zastąpić wyspecyfikowanymi nazwami kolumn, które chcemy mieć w wyniku wstydnis.gif czyli przykładowo

SELECT pomiar.id,nick.nick,pomiar.pomiar1,....,pomiar.pomiar200
FROM pomiar, nick
WHERE nick.id_uzytkownika = pomiar.id_uzytkownika;


A przeczytałeś pierwszego posta? Bo wydaje mi się, że średnio...

Cytat
Niestety przy tej ilości kolumn jeśli miałbym każdą z nich osobno adresować to chyba bym się zapisał na śmierć smile.gif.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.