Wpis z mikrobloga

Czy da się jednym zapytaniem #mysql pobrać kilka rekordów z różnych tabel i wynik władować do osobnych tablic/obiektów? Chodzi o #php i PDO. Chcę uniknąć sytuacji, że zrobię 10 osobnych zapytań aby pobrać dane (teoretycznie niepowiązane) z różnych tabel.

$query2 = $pdo->query("SELECT * FROM ksiazki ORDER BY statuses_id DESC LIMIT 1;");
$server2 = $query2->fetchObject();

$query3 = $pdo->query("SELECT * FROM mole ORDER BY liczba DESC LIMIT 1");
$server3 = $query3->fetchObject();

#programowanie #bazydanych
  • 13
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@lutecki: Jeżeli dane są takie same w osobnych tabelach, to union. Natomiast jeśli są różne, to robisz osobnymi zapytaniami, albo left join, jeśli zachodzą pomiędzy nimi relacje.
  • Odpowiedz
@arysto2011 @zakopiak @januzi: OK, zobrazuję w pełni sytuację.

Mam tabelę w której każdy rekord to jest jedno "zgłoszenie" klienta. Jako, że znajdują się tam pola, które mogą być często aktualizowane, to pomyślałem, że przeniosę je do osobnej tabeli, aby móc stworzyć historię obsługi zgłoszenia. Więc pola jak "diagnoza" czy "uwagi wewnętrzne" przeniosłem do jednej tabeli i każdy z tych "wpisów" dostaje po prostu taga (powiedzmy że statustype)
  • Odpowiedz
@lutecki:

left join meta as m1 on m1.x = y and m1.pole = 'a'
left join meta as m2 on m2.x = y and m2.pole = 'b'
powielić tyle razy, ile dodatkowych kolumn chcesz wyciągnąć
klucz na kolumnie zawierającej id z tabeli głównej oraz na kolumnie z nazwą pola, czyli: (x, pole)
  • Odpowiedz
@januzi: To mi nawet działa i wygląda na rozwiązanie mojego problemu, tylko powiedz czy da się zrobić aby w obiekcie odpowiedzi MySQL znalazł się jakiś prefix przy nazwach kolumn dla kolejnych JOIN? Bo teraz to mam po prostu zdublowane nazwy kolumn (bo pobieram 2 różne wpisy z tej samej tabeli).
  • Odpowiedz
@januzi: Tak, tylko jak dostaję (w Sequel Pro) wynik to w nazwach kolumn nie dostaję prefixów. Zaraz sprawdzę, bo być może w PHP już one będą.
  • Odpowiedz
@januzi: I jest tak jak podejrzewałem. W wyniku kolumna jest nadpisywana (trzeci JOIN nadpisuje zawartość drugiego JOIN który odnosi się do tej samej tabeli do trzeci).
  • Odpowiedz
W wyniku kolumna jest nadpisywana (trzeci JOIN nadpisuje zawartość drugiego JOIN który odnosi się do tej samej tabeli do trzeci).


@lutecki: Jeśli pobierasz kilka kolumn o tej samej nazwie, to musisz w SELECT zrobić aliasy, np. m1.x as m1_x, m2.x as m2_x.

Ogólnie nie jestem przekonany co do tego, czy powinieneś robić to jednym zapytaniem. No chyba, że każde zgłoszenie może mieć tylko jedną diagnozę i tylko jedne uwagi. W przeciwnym wypadku masz relację jeden
  • Odpowiedz