Zapytanie MySQL łączące 3 tabele
|
Adam Stalica |
Dodany dnia 26.08.2011 21:01:32
|
Początkujący
Postów: 213 Pomógł: 13
v7.02.03 Data rejestracji: 05.08.2010 17:24
|
Witam,
robię obecnie wtyczkę reklamową i napotkałem na problem, a mianowicie mam 3 tabele:
Przedstawiam zrzuty struktury tabel:
Tabela 1 & 2 (One mają tą samą strukturę):
Tabela 3:
i potrzebuję napisać zapytanie MySQL, które wyświetli mi wszystkie rekordy z tych 3 tabel według button_order ASC <tzn. według ustawionej kolejności>...
Bardzo proszę o pomoc i za każdą nawet najmniejszą z góry dziękuję
Pozdrawiam
Adam
PW od moderatora:
- Odświeżenie Tematu - Pieka 03.09.2011 23:21
Edytowane przez Adam Stalica dnia 27.08.2011 13:10:17
Witam
|
|
|
|
Wścibski Gość |
Dodany dnia 24.11.2024 23:55:31
|
Pan Kontekstualny
Postów: n^x
Data rejestracji: Zawsze
|
|
IP: localhost |
|
|
kefirek |
Dodany dnia 26.08.2011 22:08:30
|
Zaawansowany
Postów: 1191 Pomógł: 418 Ostrzeżeń: 1
v6.00.xxx Data rejestracji: 06.04.2008 21:59
|
SELECT * FROM (
SELECT * FROM tabela1
USNION ALL
SELECT * FROM tabela2
USNION ALL
SELECT * FROM tabela3
) AS tab ORDER BY button_order ASC
|
|
|
|
Adam Stalica |
Dodany dnia 26.08.2011 22:16:25
|
Początkujący
Postów: 213 Pomógł: 13
v7.02.03 Data rejestracji: 05.08.2010 17:24
|
Coś niestety nie śmigło:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ALL SELECT * FROM adam_stalica_buttons_internet USNION ALL SELECT * FROM adam' at line 3
A dałem taki kod:
$result = dbquery("SELECT * FROM (
SELECT * FROM ".DB_BUTTONS_SERWER."
USNION ALL
SELECT * FROM ".DB_BUTTONS_INTERNET."
USNION ALL
SELECT * FROM ".DB_BUTTONS_SCRIPT."
) AS tab ORDER BY button_order ASC");
Witam
|
|
|
|
kefirek |
Dodany dnia 27.08.2011 01:04:26
|
Zaawansowany
Postów: 1191 Pomógł: 418 Ostrzeżeń: 1
v6.00.xxx Data rejestracji: 06.04.2008 21:59
|
Adam Stalica napisał(a):
Coś niestety nie śmigło:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ALL SELECT * FROM adam_stalica_buttons_internet USNION ALL SELECT * FROM adam' at line 3
A dałem taki kod:
$result = dbquery("SELECT * FROM (
SELECT * FROM ".DB_BUTTONS_SERWER."
USNION ALL
SELECT * FROM ".DB_BUTTONS_INTERNET."
USNION ALL
SELECT * FROM ".DB_BUTTONS_SCRIPT."
) AS tab ORDER BY button_order ASC");
Zrobiłem literówkę zamiast USNION ALL daj UNION ALL
czyli
$result = dbquery("SELECT * FROM (
SELECT * FROM ".DB_BUTTONS_SERWER."
UNION ALL
SELECT * FROM ".DB_BUTTONS_INTERNET."
UNION ALL
SELECT * FROM ".DB_BUTTONS_SCRIPT."
) AS tab ORDER BY button_order ASC");
|
|
|
|
Adam Stalica |
Dodany dnia 27.08.2011 12:52:23
|
Początkujący
Postów: 213 Pomógł: 13
v7.02.03 Data rejestracji: 05.08.2010 17:24
|
Niestety kolejny błąd mi wyświetliło:
The used SELECT statements have a different number of columns
Jeśli dam taki:
$result = dbquery("SELECT * FROM (
SELECT * FROM ".DB_BUTTONS_SERWER."
UNION ALL
SELECT * FROM ".DB_BUTTONS_INTERNET."
) AS tab ORDER BY button_order ASC");
To te 2 tabele działają <One mają tą samą budowę tak jak jest pokazane na 1 screenie>, ale jak już dodam 3 tabelę to wyświetla się błąd co podałem w code podejrzewam, że przez to, że ma inną budowę...
Proszę o dalsze wskazówki jak to rozwiązać...
Witam
|
|
|
|
kefirek |
Dodany dnia 27.08.2011 15:20:27
|
Zaawansowany
Postów: 1191 Pomógł: 418 Ostrzeżeń: 1
v6.00.xxx Data rejestracji: 06.04.2008 21:59
|
Bo w tych 3 tabelach liczba kolumn musi być ta sama i nazwy kolumn te same jeśli chcesz użyć *. Widocznie w trzeciej tabeli jest więcej kolumn wiec zamiast * podajesz nazwy kolumn oczywiście muszą istnieć w 3 tabelach i mieć te same. Np
$result = dbquery("SELECT * FROM (
SELECT button_name, button_order FROM ".DB_BUTTONS_SERWER."
UNION ALL
SELECT button_name, button_order FROM ".DB_BUTTONS_INTERNET."
UNION ALL
SELECT button_name, button_order FROM ".DB_BUTTONS_SCRIPT."
) AS tab ORDER BY button_order ASC");
Edytowane przez Drecha dnia 27.08.2011 15:32:42
|
|
|
|
Adam Stalica |
Dodany dnia 27.08.2011 15:36:47
|
Początkujący
Postów: 213 Pomógł: 13
v7.02.03 Data rejestracji: 05.08.2010 17:24
|
Jak zwykle jesteś niezawodny
Dziękuję bardzo za pomoc
Doszedłem dziś trochę wcześniej do tego co mi teraz napisałeś, ale myślałem, że podasz jakieś rozwiązanie, że będę mógł wybrać wszystkie kolumny ;p
Jeszcze raz dziękuję bardzo za pomoc
Oczywiście zasłużone pomógł daję...
Pozdrawiam
Adam
Witam
|
|
|
|
kefirek |
Dodany dnia 27.08.2011 18:19:52
|
Zaawansowany
Postów: 1191 Pomógł: 418 Ostrzeżeń: 1
v6.00.xxx Data rejestracji: 06.04.2008 21:59
|
Można pobrać wszystkie ale wtedy stosujesz np nazwa_kolumny AS button_name tak by się nazwy zgadzały w każdej z tabel jakbyś pokazał jakie kolumny masz w 3 tabeli to coś by się zaradziło |
|
|
|
Adam Stalica |
Dodany dnia 28.08.2011 12:10:52
|
Początkujący
Postów: 213 Pomógł: 13
v7.02.03 Data rejestracji: 05.08.2010 17:24
|
W 1 poście masz screena z 3 tabeli
Edytowane przez Pieka dnia 28.08.2011 16:52:10
Witam
|
|
|
|
kefirek |
Dodany dnia 28.08.2011 13:53:48
|
Zaawansowany
Postów: 1191 Pomógł: 418 Ostrzeżeń: 1
v6.00.xxx Data rejestracji: 06.04.2008 21:59
|
Nie sprawdzałem ale powinno działać
$result = dbquery("SELECT * FROM (
SELECT
button_id, button_order, button_name, NULL AS button_script, button_image, button_height, button_width,
button_link, button_alt, button_limit_clicks, button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_SERWER."
UNION ALL
SELECT
button_id, button_order, button_name, NULL AS button_script, button_image, button_height, button_width,
button_link, button_alt, button_limit_clicks, button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_INTERNET."
UNION ALL
SELECT
button_id, button_order, button_name, button_script, NULL AS button_image, NULL AS button_height, NULL AS button_width,
NULL AS button_link, NULL AS button_alt, NULL AS button_limit_clicks, NULL AS button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_SCRIPT."
) AS tab ORDER BY button_order ASC");
|
|
|
|
Adam Stalica |
Dodany dnia 28.08.2011 14:14:14
|
Początkujący
Postów: 213 Pomógł: 13
v7.02.03 Data rejestracji: 05.08.2010 17:24
|
Jak zawsze jesteś niezawodny ;)
Działa ;)
Bardzo Ci dziękuję i oczywiście kolejne zasłużone pomógł daję ;)
Pozdrawiam
Adam ;)
Połączony z 28 sierpień 2011 14:24:
A jeszcze mam jedno pytanko...
Pomożesz mi połączyć teraz to:
$result = dbquery("SELECT * FROM (
SELECT
button_id, button_order, button_name, NULL AS button_script, button_image AS button_image_internet, button_height, button_width,
button_link, button_alt, button_limit_clicks, button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_SERWER."
UNION ALL
SELECT
button_id, button_order, button_name, NULL AS button_script, button_image AS button_image_serwer, button_height, button_width,
button_link, button_alt, button_limit_clicks, button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_INTERNET."
UNION ALL
SELECT
button_id, button_order, button_name, button_script, NULL AS button_image, NULL AS button_height, NULL AS button_width,
NULL AS button_link, NULL AS button_alt, NULL AS button_limit_clicks, NULL AS button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_SCRIPT."
) AS tab");
Z kodem:
$result = dbquery("SELECT a.*, b.*
FROM ".DB_BUTTONS_SERWER." a
LEFT JOIN ".DB_PREFIX."buttons_wyswietlanie b
ON b.nr_buttona=a.button_order
WHERE ip='".USER_IP."'
");
$result = dbquery("SELECT a.*, b.*
FROM ".DB_BUTTONS_INTERNET." a
LEFT JOIN ".DB_PREFIX."buttons_wyswietlanie b
ON b.nr_buttona=a.button_order
WHERE ip='".USER_IP."'
");
$result = dbquery("SELECT a.*, b.*
FROM ".DB_BUTTONS_SCRIPT." a
LEFT JOIN ".DB_PREFIX."buttons_wyswietlanie b
ON b.nr_buttona=a.button_order
WHERE ip='".USER_IP."'
");
Muszę każdej tabeli z osobna nadawać alians, a następnie wszystko łączyć ze sobą przez LEFT JOIN czy można to jakoś łatwiej zrobić?
Edytowane przez Adam Stalica dnia 28.08.2011 14:33:38
Witam
|
|
|
|
kefirek |
Dodany dnia 28.08.2011 16:43:27
|
Zaawansowany
Postów: 1191 Pomógł: 418 Ostrzeżeń: 1
v6.00.xxx Data rejestracji: 06.04.2008 21:59
|
Nie sprawdzałem ale powinno zadziałać
$result = dbquery("SELECT *, b.* FROM (
SELECT
button_id, button_order, button_name, NULL AS button_script, button_image AS button_image_internet, button_height, button_width,
button_link, button_alt, button_limit_clicks, button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_SERWER."
UNION ALL
SELECT
button_id, button_order, button_name, NULL AS button_script, button_image AS button_image_serwer, button_height, button_width,
button_link, button_alt, button_limit_clicks, button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_INTERNET."
UNION ALL
SELECT
button_id, button_order, button_name, button_script, NULL AS button_image, NULL AS button_height, NULL AS button_width,
NULL AS button_link, NULL AS button_alt, NULL AS button_limit_clicks, NULL AS button_clicks, button_limit_views,
button_views, button_user, button_pass
FROM ".DB_BUTTONS_SCRIPT."
) AS tab
LEFT JOIN ".DB_PREFIX."buttons_wyswietlanie b
ON b.nr_buttona=tab.button_order
WHERE ip='".USER_IP."' ORDER BY button_order DESC
");
|
|
|
|
Adam Stalica |
Dodany dnia 03.09.2011 23:21:40
|
Początkujący
Postów: 213 Pomógł: 13
v7.02.03 Data rejestracji: 05.08.2010 17:24
|
Nie mogło być inaczej - działa ;)
Nie mogę już dać Ci kolejnego pomógł, dlatego proszę administrację o danie zasłużonego pomógł dla użytkownika @kefirek ;)
Pozdrawiam i @kefirek dziękuję Ci bardzo za pomoc...
EDIT:
Jeszcze jedno pytanko:
Czy można ten kod łatwiej zapisać?
$result = dbquery("SELECT * FROM (
SELECT
button_id
FROM ".DB_BUTTONS_SERWER."
UNION ALL
SELECT
button_id
FROM ".DB_BUTTONS_INTERNET."
UNION ALL
SELECT
button_id
FROM ".DB_BUTTONS_SCRIPT."
) AS tab");
$kolejnosc = dbrows($result)+1;
Ten kod działa, ale czy jest w miarę optymalny?
Chodzi w nim o to, aby odczytać największą wartość button_order i dodać do niej 1 ;)
Pozdrawiam
Adam ;)
Edytowane przez Adam Stalica dnia 04.09.2011 22:05:35
Witam
|
|
|