Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Łączenie 2 tabele i IFNULL(tabela2.id, tabela1.id)
kajtek2008
post 24.01.2013, 12:33:49
Post #1





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


  1. SELECT object.id AS id, ifnull(object_stats.id, object.id) AS id, id_c, kat, short_city, short_url, profil,
  2. STATUS , name, date, wyswietlen, ifnull( date, '2013-01-24' ) AS date, ifnull( wyswietlen, '0' ) AS wyswietlen
  3. FROM object
  4. RIGHT JOIN object_stats ON object.id = object_stats.id
  5. WHERE city = 'krakow'
  6.  
  7. AND (
  8. date = (SELECT max( date ) FROM object_stats )
  9. )
  10. AND profil = '1'
  11. GROUP BY object.id
  12. ORDER BY object_stats.date, object_stats.wyswietlen DESC



Mam takie zapytanie męczę się z nim od kilku dni i nie mogę sobie poradzić

Chodzi mi o połączenie 2 tabel i jeśli w drugiej tabeli niema danych to zeby przyjął domyślne wartości np

mamy profil w tabeli object 2332 ale tego profilu niema w object_stats, jeśli niema to ustawia domyślne wartości id. taki jaki ma tabela object_stats wyswietlen i data dzisiejsza w tym przypadku 2013-01-24
Go to the top of the page
+Quote Post
mmmmmmm
post 24.01.2013, 15:01:18
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


To co masz we WHERE daj do JOIN zamiast WHERE.
Czyli:
  1. SELECT object.id AS id, ifnull(object_stats.id, object.id) AS id, id_c, kat, short_city, short_url, profil,
  2. STATUS , name, date, wyswietlen, ifnull( date, '2013-01-24' ) AS date, ifnull( wyswietlen, '0' ) AS wyswietlen
  3. FROM object
  4. RIGHT JOIN object_stats ON object.id = object_stats.id
  5. AND city = 'krakow'
  6. AND (
  7. date = (SELECT max( date ) FROM object_stats )
  8. )
  9. AND profil = '1'
  10. GROUP BY object.id
  11. ORDER BY object_stats.date, object_stats.wyswietlen DESC
Go to the top of the page
+Quote Post
kajtek2008
post 24.01.2013, 15:23:57
Post #3





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Cytat(mmmmmmm @ 24.01.2013, 15:01:18 ) *
To co masz we WHERE daj do JOIN zamiast WHERE.
Czyli:
  1. SELECT object.id AS id, ifnull(object_stats.id, object.id) AS id, id_c, kat, short_city, short_url, profil,
  2. STATUS , name, date, wyswietlen, ifnull( date, '2013-01-24' ) AS date, ifnull( wyswietlen, '0' ) AS wyswietlen
  3. FROM object
  4. RIGHT JOIN object_stats ON object.id = object_stats.id
  5. AND city = 'krakow'
  6. AND (
  7. date = (SELECT max( date ) FROM object_stats )
  8. )
  9. AND profil = '1'
  10. GROUP BY object.id
  11. ORDER BY object_stats.date, object_stats.wyswietlen DESC



Przy RIGHT JOIN dodało 1 nulla z nieistniejącym profilem w OBJECT
Przy LEFT JOIN Wyświetliło Wszystko z object z innym miastem itp

Ten post edytował kajtek2008 24.01.2013, 15:26:26
Go to the top of the page
+Quote Post
mmmmmmm
post 24.01.2013, 15:34:34
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


tak sobie zmieniasz LEFT/RIGHT?
Masz pojęcie co to w ogóle robi? Znasz strukturę?
Może wklej szczątkowe dane z obu tabel i oczekiwany wynik...
Go to the top of the page
+Quote Post
kajtek2008
post 24.01.2013, 20:57:07
Post #5





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Znaczy ogólnie obróciłem tabele, jeśli chodzi o tego WHERE


Dam przykład w takiej wersji

  1. stat
  2.  
  3. id data wyswietlen
  4. 1 2013-01-23 10
  5. 1 2013-01-24 9
  6. 2 2013-01-23 13
  7. 3 2013-01-23 5


  1. Profile
  2.  
  3. id nazwa
  4. 1 jeden
  5. 3 trzy
  6. 4 cztery
  7. 5 pięć
  8. 6 sześć


  1. Oczekiwany wynik
  2.  
  3. id nazwa wyświetleń data
  4. 1 jeden 9 2013-01-24
  5. 2 dwa 0 2013-01-24
  6. 3 trzy 0 2013-01-24
  7. 4 cztery 0 2013-01-24
  8. 5 pięc 0 2013-01-24
  9. 6 sześć 0 2013-01-24


Ten post edytował kajtek2008 24.01.2013, 20:57:56
Go to the top of the page
+Quote Post
wiiir
post 24.01.2013, 21:32:06
Post #6





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


nie wiem skad w wynikach "dwa" sie wzielo

profile left join stat
Go to the top of the page
+Quote Post
kajtek2008
post 24.01.2013, 22:58:18
Post #7





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Cytat(wiiir @ 24.01.2013, 21:32:06 ) *
nie wiem skad w wynikach "dwa" sie wzielo

profile left join stat



Faktycznie miałem na początku lefta, ale zmieniłem na right bo był problem z ilością wyświetleń. Przestało to jednak wyświetlać poprawnie po dodaniu MAX(date) pomijał pierwsze rekordy w których były relacje do innych dat.

Przetestuje jak działa to w ciut dłuższym okresie bo baza ma tysiące rekordów.





Da się poniższe zapytanie bardziej zredukować ? ponieważ dość długo się wykonuje zapytanie


  1. SELECT object.id AS id, ifnull( object_stats.id, object.id ) AS id, id_c, kat, short_city, short_url, profil,
  2. STATUS, name, date, wyswietlen, ifnull( date, '2013-01-24' ) AS date, ifnull( wyswietlen, '0' ) AS wyswietlen
  3. FROM object
  4. LEFT JOIN object_stats ON object.id = object_stats.id
  5. AND ( date = (SELECT max( date ) FROM object_stats ))
  6. WHERE city = 'krakow'
  7. GROUP BY object.id
  8. ORDER BY `wyswietlen` DESC
  9.  


Ten post edytował kajtek2008 24.01.2013, 23:03:35
Go to the top of the page
+Quote Post
wiiir
post 25.01.2013, 21:07:16
Post #8





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


zamiast tego
AND ( date = (SELECT max( date ) FROM object_stats ))

sprobuj
  1. SELECT max(date)....
  2. FROM object
  3. LEFT JOIN object_stats ON object.id = object_stats.id
  4. WHERE city = 'krakow'
  5. GROUP BY object.id
  6. HAVING max(date) = date
  7. ORDER BY `wyswietlen` DESC


i daj index na city

probuj rozne rzeczy z explain plan
Go to the top of the page
+Quote Post
kajtek2008
post 26.01.2013, 18:33:07
Post #9





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Cytat(wiiir @ 25.01.2013, 21:07:16 ) *
zamiast tego
AND ( date = (SELECT max( date ) FROM object_stats ))

sprobuj
  1. SELECT max(date)....
  2. FROM object
  3. LEFT JOIN object_stats ON object.id = object_stats.id
  4. WHERE city = 'krakow'
  5. GROUP BY object.id
  6. HAVING max(date) = date
  7. ORDER BY `wyswietlen` DESC


i daj index na city

probuj rozne rzeczy z explain plan



ale max(date) jest w object_stats
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.06.2024 - 17:08