2014-02-13 6 views
0

Есть ли способ объединить несколько запросов (*) к одному? Я знаю, что мне не нужно готовить два последних запроса два раза, но это не вопрос. Я не знаю, как это сделать правильно.Как объединить несколько запросов (*)?

$sth = $this->_db->prepare('SELECT count(*) FROM posts WHERE topicid = ?'); 
$sth->execute(array($this->_id)); 
$numPosts = $sth->fetch(\PDO::FETCH_ASSOC); 

$sth = $this->_db->prepare('SELECT count(*) FROM topic_activity WHERE topicid = ?'); 
$sth->execute(array($this->_id)); 
$numViews = $sth->fetch(\PDO::FETCH_ASSOC); 

$sth = $this->_db->prepare('SELECT count(*) FROM topic_activity WHERE topicid = ? AND likes = 1'); 
$sth->execute(array($this->_id)); 
$numLikes = $sth->fetch(\PDO::FETCH_ASSOC); 

$sth = $this->_db->prepare('SELECT count(*) FROM topic_activity WHERE topicid = ? AND likes = -1'); 
$sth->execute(array($this->_id)); 
$numDislikes = $sth->fetch(\PDO::FETCH_ASSOC); 

ответ

1

Хотя ответ user3106988 «работает», я пошел бы на более «вертикальной» подхода (а также хранить идентификатор в переменной, Вам нужно только пройти его один раз, может быть это не работает в вашей среде, хотя, так что может быть вам необходимо заменить @ идентификаторы с 4 знаками вопроса, но, надеюсь, нет):

SET @id = ?; 

SELECT info = 'Posts', count(*) FROM posts WHERE topicid = @id 
UNION ALL 
SELECT info = 'Views', count(*) FROM topic_activity WHERE topicid = @id 
UNION ALL 
SELECT info = 'Likes', count(*) FROM topic_activity WHERE topicid = @id AND likes = 1 
UNION ALL 
SELECT info = 'DisLikes', count(*) FROM topic_activity WHERE topicid = @id AND likes = -1 

но который возвращает 4 записи, где y Затем необходимо извлечь данные с помощью поля info. Таким образом, основываясь на идее ответа user3106988, чтобы вернуть только 1 запись со всей информацией в разных полях, вы могли бы пойти на понравившиеся & диски, так как мало усилий, как показано ниже. Должно быть довольно быстро.

SET @id = ?; 

SELECT SUM(count_posts) as count_posts, 
     SUM(views) as views, 
     SUM(likes) as likes, 
     SUM(dislikes) as dislikes 
FROM(
    SELECT COUNT(*) as count_posts, 
      0 as views, 
      0 as likes, 
      0 as dislikes 
     FROM posts 
    WHERE topicid = @id 
UNION ALL 
    SELECT 0 as count_posts, 
      COUNT(*) as views, 
      SUM(Case WHEN likes = 1 THEN 1 ELSE 0 END) as likes, 
      SUM(Case WHEN likes = -1 THEN 1 ELSE 0 END) as dislikes 
     FROM topic_activity 
    WHERE topicid = @id 
) T; 
+0

Ничего себе. Genius. Zeige Datensätze 0 - 0 (1 insgesamt, Die Abfrage dauerte 0,0021 Sekunden) – user2429266

+0

3 Запросы. Каждый из них будет работать в 0,0003s. Это решение принимает 0,0021. В этом случае все еще лучше, чем несколько одиночных запросов? – user2429266

+0

Трудно сказать; Я удивлен, узнав, что их комбинация занимает гораздо больше времени. Какой подход лучше всего ... не знаю; Я думаю, это зависит от того, сколько накладных расходов в вашей программе запускать 3 запроса и получать 3 значения один за другим; против выполнения всего 1 запроса, но с немедленными результатами. – deroby

2
SELECT count_post, topic_activity 
FROM(
    SELECT count(*) AS count_post, NULL AS topic_activity FROM posts WHERE topicid = ? 
UNION 
    SELECT NULL AS count_post, count(*) AS topic_activity FROM topic_activity WHERE topicic =? 
) T 
GROUP by count_post, topic_activity 

дайте мне знать, если он работает

+0

Sry. Работы .. Я испортил это с помощью? заполнители. Спасибо за это. – user2429266

+0

Собственно, имхо НЕ работает так, как предполагалось. Мне кажется, user3106988 попытался вернуть 1 запись с двумя значениями, но из-за «GROUP BY» фактически перезаписывает 1 запись с данными для одного столбца и другой записью с данными для другой записи. Просто удалите последнюю строку и используйте SUM() вокруг полей в части «SELECT». – deroby

Смежные вопросы