Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Qt] QTableView - relacyjny widok z bazy danych
Forum PHP.pl > Inne > Komputery i oprogramowanie
winuser
Witajcie

Aktualnie piszę aplikację bazodanową co prawda nie w PHP, a w C++ z użyciem bibliotek Qt, baza danych to MySQL więc chyba dział dobry. I mam pewien problem nad którym się głowię. Mianowicie posiadam 2 tabele, jedna w której przechowywane są osoby w formie (dajmy na to lista klientów) :

  1. int user_id
  2. VARCHAR(40) name


natomiast druga tabela (dajmy na to do przechowywania listy zakupów):

  1. int user_id
  2. int product_id


Tabele z listą zakupów wyświetlam w widżecie QTableView, po wcześniejszym powiązaniu jej z QSqlTableModel. Chciałbym aby zamiast liczb w tabeli z listą zakupów (pole user_id) było wyświetlane automatycznie pole "name" z tabeli klientów. Niestety typy pól są inne (int vs varchar) i nie mam pomysłu jak coś takiego zrobić. Pomożecie ? smile.gif
YaQzi
Nie rozumiem trochę...

"Chciałbym aby zamiast liczb w tabeli z listą zakupów (pole user_id) było wyświetlane automatycznie pole "name" z tabeli klientów."
Przebuduj sobie strukturę tabeli i inserty do niej. :x

Chyba, że chodzi Ci o zapytanie do bazy, które połączy te dwie tabele i da listę product_id | name to:
  1. SELECT L.product_id,
  2. (
  3. SELECT name
  4. FROM osoba
  5. WHERE user_id = L.user_id
  6. )
  7. FROM lista L


albo za pomocą JOIN takie coś.
Rid
Cytat
Nie rozumiem trochę...

Prawdę mówiąc, ja też nie.

Zawsze można konwertować string na int przed zapisem do bazy,tylko po co questionmark.gif
thek
A ja bym Ci się radził zastanowić czy MySQL to tutaj dobry wybór... Aplikacja będzie bowiem wymagać do działania postawionego serwera, co niekoniecznie będzie możliwe jeśli ma ona być przenośna. Zabierzesz soft na pendrive i u kogoś nie uruchomisz już bo on nie będzie umiał dostać się do bazy. W takich wypadkach lepiej zdać się na wspieraną także w Qt inną bazę... SQlite.
winuser
@up nie rozumiem co twoja wypowiedź ma do rzeczy ? Ja nie zadałem pytania typu "jaką bazę wybrać aby nie wymagała serwera SQL". BA, nawet nigdzie nie napisałem, że ma ona być przenośna. Wybacz, ale drażnią mnie ludzie którzy wszędzie wszystkim chcą wciskać swoje mądrości.

Niestety nikt z was mnie nie zrozumiał tongue.gif Być może dlatego że ja piszę projekt w C++ a wy używacie PHP. Jak już wspomniałem używam bibliotek Qt do zrealizowania tego projektu, że używam klasy QTableView z wywołaniem setModel(QSqlTableModel) która to klasa ostatnia odwala za mnie wszystkie zapytania i automatycznie wyświetla je w tabelce.

Najbliżej odpowiedzi poprawnej był YaQzi, za co dostaje punkt.

Skorzystam z klasy QSqlRelationalTableModel.
thek
To co napisałem w sprawie bazy to była tylko sugestia. Niestety, ale obecność bibliotek Qt do obsługi różnych baz w przypadku braku postawionego na kompie serwera tejże bazki jest tak samo sensowna jak próba gaszenia pożaru bez posiadania czegokolwiek do tego celu wink.gif Ma ona sens tylko w wypadku gdy faktycznie całość będzie nieprzenośna. IMHO uważam, że takie podejście to bardzo poważne ograniczenie.
Co do samego tematu...
  1. SELECT l.*, u.name FROM lista AS l LEFT JOIN users AS u ON l.user_id = u.user_id
YaQuzi dał wynik, ale jego wydajność jest delikatnie mówiąc nieco dyskusyjna. Dobrze chociaż, że zauważył, iż JOIN można użyć.
YaQzi
Join też tego magicznie nie skleja tylko musi podobnie do podselecta wyszukać co połączyć. wink.gif Na moje oko to user_id w drugiej tabeli jest co najmniej uniq więc nie ma powtarzalnych podselectów po tym samym. Krócej w kodzie nie zawsze znaczy wydajniej ale dobra, w sumie nie o wydajności temat. tongue.gif

@winuser
Jeśli QSqlTableModel daje Ci model jednej z tabel bazy danych to spróbuj sobie z zapytania zrobić widok i do niego dostać się przez QSqlTableModel.
thek
Owszem, ale podzapytania zazwyczaj (wiadomo... zależy od sytuacji) są mniej wydajne niż złączenia. Poza kartezjańskim, które najczęsciej jest efektem kompletnego braku wiedzy o złączeniach w bazie u piszącego.
tiraeth
Kolego winuser, drażnią mnie osoby, które nawet nie sięgają do oficjalnej dokumentacji Nokii nt. chociażby QSqlRelationalTableModel. Zanim następnym razem zadasz pytanie, przeglądnij dokumentację biblioteki, której używasz.

Zakładając, że masz:
users: user_id, name
user_products: user_id, product_id

I chcesz wyświetlić wszystkie rekordy z user_products, automatycznie dołączając zawartość tabeli users i ukrywając pole user_id, powinieneś zrobić coś takiego:

  1. QSqlRelationalTableModel *model = new QSqlRelationalTableModel;
  2. model->setTable("user_products");
  3. model->setRelation(1, QSqlRelation("users", "user_id", "name"));


Co oznacza: kolumna "1" w tabeli user_products jest kluczem obcym do tabeli users (gdzie kluczem głównym jest user_id) i jej zawartość ma zostać zastąpiona zawartością kolumny name z tabeli users.

Ponieważ temat nie ma nic wspólnego z MySQL, przenoszę do go Komputery i oprogramowanie.
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.