mysql optymalizacja zapytania

0

Cześć, w fazie developmentu aplikacji mobilnej, serwer api pisałem na szybko, teraz przyszedł czas na optymalizacje zapytań, zakładając mam takie zapytanie:

 SELECT distinct News.*,(SELECT count(subscribeNews.apikey) from subscribeNews WHERE subscribeNews.NewsID = News.id AND subscribeNews.apikey = ?) AS subscribe,(SELECT firmDetails.miasto from firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmcity ,(SELECT firmDetails.name from firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmname,(SELECT firmDetails.ulica from firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmulica ,(SELECT firmDetails.email from firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmemail ,(SELECT firmDetails.phone from firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmphone, (SELECT count(comment.id) from Comment WHERE Comment.NewsID = News.id AND Comment.user_api = ?) AS liczbaComment    FROM News WHERE News.status = 'dodano' ORDER BY dataOD DESC LIMIT ? OFFSET ? ;

w jaki sposób najlepiej to doprowadzić do porządku? join inner? korzystać z widoków? w jaki sposób tego typu zapytania zapisać żeby sie możliwie najszybciej wykonywały?

0

nie sądzę abyś uzyskał na forum jakąkolwiek odpowiedź jeśli nie sformatujesz zapytania do czytelniej i zrozumiałej dla czytelnika postaci

0
  SELECT
 DISTINCT News.*,
(SELECT COUNT(subscribeNews.apikey) FROM subscribeNews WHERE subscribeNews.NewsID = News.id AND subscribeNews.apikey = ?) AS subscribe,
(SELECT firmDetails.miasto FROM firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmcity ,
(SELECT firmDetails.name FROM firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmname,
(SELECT firmDetails.ulica FROM firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmulica ,
(SELECT firmDetails.email FROM firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmemail ,
(SELECT firmDetails.phone FROM firmDetails WHERE  News.apikey = firmDetails.apikey) AS firmphone, 
(SELECT COUNT(comment.id) FROM Comment WHERE Comment.NewsID = News.id AND Comment.user_api = ?) AS liczbaComment 
   FROM News 
WHERE News.STATUS = 'dodano' 
ORDER BY dataOD DESC LIMIT ? OFFSET ? ;
0

przecież to jest masakra a nie zapytanie - każde pole jako osobne zapytanie dodatkowo z tej samej tabeli???? Na szybko to by było napisane góra z tymi dwoma COUNT jako podzapytania a to to jest jakiś potworek, nad którym trzeba było myśleć i to długo.

Poprawnie to powinny być 3 left join (albo join w zależności co chcesz dostać), group by i tyle

0

To już to lepiej wygląda i na pewno szybciej działa

  SELECT
		DISTINCT n.*,
		COUNT(sn.apikey) AS subscribe,
		fd.miasto AS firmcity ,
		fd.name AS firmname,
		fd.ulica AS firmulica ,
		fd.email AS firmemail ,
		fd.phone AS firmphone, 
		COUNT(c.id)  AS liczbaComment 
   FROM News n
	inner join firmDetails  fd on sn.apikey = n.apikey
	inner join subscribeNews sn on snSubscribe.NewsID = n.id AND snSubscribe.apikey = ?
	inner join Command c on c.NewsID = n.id AND c.user_api = ?
   WHERE n.STATUS = 'dodano' 
   ORDER BY dataOD DESC LIMIT ? OFFSET ? ;
 
0

Dzieki, troche sie rozjaśniło, ale
chce zeby subscribeNews i Command nie bylo wymagane, dostaje taki blad;

 - 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 'FULL JOIN subscribeAds sA ON sA.AdsID = a.id 
  FROM News n
    FULL JOIN subscribeNews sN ON sN.AdsID = a.id 
  Inner  JOIN firmDetails  fd ON sN.apikey = n.apikey  AND sN.apikey = 'fdfdfdfd'
    FULL JOIN Command c ON c.AdsID = a.id AND c.pracownik_apikey = 'fdfdfdfd'
   
0

mam kilka tabeli, i teraz zauwazylem ze blad dotyczy innej, poprawilem nazwy ale i tak nie moge dolaczyc

1

Tak patrzę i patrzę i FULL JOIN nie widzę

0

natural join zwraca mi wszystko nullem, zreszta jak usune z zapytania subscribeNews to wyswietli mi wynik, ale tylko jeden

0
Skromny Mleczarz napisał(a):

chce zeby subscribeNews i Command nie bylo wymagane, dostaje taki blad;

  FROM News n
    left JOIN subscribeNews sN ON sN.AdsID = a.id 
  Inner  JOIN firmDetails  fd ON sN.apikey = n.apikey  AND sN.apikey = 'fdfdfdfd'
    left JOIN Command c ON c.AdsID = a.id AND c.pracownik_apikey = 'fdfdfdfd'
0

zwraca null

0

może dlatego, że sN.apikey jest nie przy tym joinie

0

te subscribeNews zrobilem ze zwykłego selecta, a reszta jest za pomocą joina, ale czas wykonywania zapytania są praktycznie takie same, czy jak moje poprzednie zapytanie czy jak to wykonane "porządnie" sa ta czasy rzedu 200ms

0

nie zrozumiałeś - zamiast

 FROM News n
    LEFT JOIN subscribeNews sN ON sN.AdsID = a.id 
  INNER  JOIN firmDetails  fd ON sN.apikey = n.apikey  AND sN.apikey = 'fdfdfdfd'
    LEFT JOIN Command c ON c.AdsID = a.id AND c.pracownik_apikey = 'fdfdfdfd'

powinno być

 FROM 
  News n
  INNER  JOIN firmDetails  fd ON fd.apikey = n.apikey  
  LEFT JOIN subscribeNews sN ON sN.AdsID = a.id AND sN.apikey = 'fdfdfdfd'
  LEFT JOIN Command c ON c.AdsID = a.id AND c.pracownik_apikey = 'fdfdfdfd'

chodzi o to, że tu INNER JOIN firmDetails fd ON sN.apikey = n.apikey AND sN.apikey = 'fdfdfdfd' odwołujesz się do tabeli sN

1 użytkowników online, w tym zalogowanych: 0, gości: 1