SELECT SQL_CALC_FOUND_ROWS a.article_id, a.article_status, a.article_views, a.article_date_added, a.article_date_modified, a.article_desc, a.article_adder, a.article_last_changer, a.article_name, ( SELECT m.member_level FROM members AS `m` WHERE LOWER(m.member_username)=LOWER(a.article_adder) ) AS `adder_level`, ( SELECT m.member_level FROM members AS `m` WHERE LOWER(m.member_username)=LOWER(a.article_last_changer) ) AS `last_changer_level` FROM articles AS `a` WHERE a.article_category_id=1 -- tu odpowiednie Id ORDER BY a.article_date_added DESC LIMIT 0,20;
Służy do wylistowania / wyszukania artykułów dla danej kategorii.
Dodatkowo zwraca mi dodatkowe informacje o dodającym oraz o osobie, która jako ostatnia edytowała artykuł (edytować może autor lub administrator), m.in to czy dodający lub ostatni edytujący jest administratorem, czy też zwykłym użytkownikiem. Oczywiście zamiast tego zera przy limicie pojawia się odpowiedni offset

Dla testu dodałem ok. 1000 artykułów do bazy.
Niestety zapytanie zbyt długo się wykonuje, a i tak testuję to tylko na localhoście.
Czas więc zoptymalizować składnię zapytania o ile się da no i dodać indeksy.
Tabela artykułów:
CREATE TABLE `articles` ( `article_id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT, `article_category_id` tinyint(3) UNSIGNED NOT NULL DEFAULT 0, `article_status` tinyint(3) UNSIGNED NOT NULL DEFAULT 0, `article_views` int(11) UNSIGNED NOT NULL DEFAULT 0, `article_date_added` datetime NOT NULL, `article_date_modified` datetime NOT NULL, `article_desc` tinytext COLLATE utf8_polish_ci NOT NULL DEFAULT '', `article_content` mediumtext COLLATE utf8_polish_ci NOT NULL DEFAULT '', `article_adder` varchar(12) COLLATE utf8_polish_ci NOT NULL DEFAULT '', `article_last_changer` varchar(12) COLLATE utf8_polish_ci NOT NULL DEFAULT '', `article_name` varchar(64) COLLATE utf8_polish_ci NOT NULL DEFAULT '', `article_safe_name` varchar(64) COLLATE utf8_polish_ci NOT NULL DEFAULT '', PRIMARY KEY (`article_id`), UNIQUE KEY `article_name` (`article_name`), UNIQUE KEY `article_safe_name` (`article_safe_name`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
Pole member_username w tabeli members:
`member_username` varchar(12) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
I pytanie tak na marginesie - stosować słówko AS w zapytaniach czy lepiej skrócony zapis bez tego słowa kluczowego?