2016-06-29 5 views
0

Я не очень опытен с более сложными материалами запросов MySQL .. (в основном базовые запросы, возврат и анализ синтаксиса ..)Несколько запросов или можно сделать в одном?

Однако .. Я не совсем понял правильный подход, когда мне нужно несколько вещей (ответы) из базы данных. Есть ли способ получить эти вещи из одного запроса? или мне нужно делать новый запрос за каждый раз?

фона: Я использую PDO, чтобы сделать отборное заявление

Ie:

$getAllVideos_sql = "SELECT * as FROM $tableName WHERE active IS NOT NULL OR active != 'no' ORDER BY topic, speaker_last, title;"; 
$getAllVideos_stmt = $conn->prepare($getAllVideos_sql); 
$getAllVideos_stmt->execute(); 
$getAllVideos_stmt->setFetchMode(PDO::FETCH_ASSOC); 
$results = $getAllVideos_stmt->fetch(PDO::FETCH_ASSOC); 

//parse as I see fit 

Это дает мне мой «кусок данных», что я могу выбрать обособленно и отображения, как я хочу.

Однако .. Я хочу быть в состоянии дать некоторые статистические данные (итоговые)

Для полного (отчетливый) «темы» .. а также общее количество для «названия» (все должны быть уникальными по умолчанию)

Нужно ли выполнять другой запрос, подготовить, выполнить, setFetchMode, извлечь все заново?

Это правильный способ сделать это? Или есть способ вырезать начальные команды, которые уже играют?

Чтобы быть ясным, я действительно не ищу запрос ... Я ищу, чтобы понять, как это сделать ... когда им нужно несколько данных, как я? несколько запросов и выполнение ..etc?

Или, может быть, оно может быть сделано в одном фрагменте? С настройкой самого запроса для возврата информации о подборе/запросах?

  • это не будет правильный синтаксис, поскольку он возвращает только 1 запись .. (но общее количество темы кажется правильным, даже если я получаю только 1 запись возвращенное)

    SELECT *, COUNT (DISTINCT) как totalTopics, count (название DISTINCT) как totalTitles FROM $ tableName;

Возможно, это более правильный подход? Попытайтесь включить эти итоговые данные/детали в основной запрос, чтобы выбрать?

Надеюсь, что это имеет смысл.

Благодаря

ответ

1

Я не думаю, что вы собираетесь получить что-нибудь очень чистый, что будет делать это, тем не менее что-то подобное может работать:

SELECT * from $Table t 
INNER JOIN (
    SELECT COUNT(DISTINCT Topic) as TotalTopics FROM $Table 
) s ON 1 = 1 
INNER JOIN (
    SELECT COUNT(DISTINCT Title) as TotalTitles FROM $Table 
) f ON 1 = 1 
WHERE (Active IS NOT NULL) AND Active != 'no' 
+0

Спасибо за ответ, похоже, работает с обновленным запросом (у меня были синтаксические ошибки) без каких-либо JOINS. '$ getAllVideos_sql =" SELECT *, (SELECT count (DISTINCT (topic)) FROM $ tableName WHERE active = ' Active ') как totalTopics, (SELECT count (DISTINCT (title)) FROM $ tableName WHERE active =' Active ') в качестве totalTitles FROM $ tableName WHERE active NOT NOT или active =' Active 'ORDER BY, speaker_last, title; " ; ' Однако .. Я не могу настроить таргетинг на мои вспомогательные запросы -as-values? Это не работает, например: $ results ['totalTopics'] Как я могу получить эти значения из моего запроса? – whispers

+0

В зависимости от того, как вы получаете информацию, $ results может быть не в той структуре, которую вы ожидаете. Попробуйте 'var_dump ($ results)', чтобы узнать, что вернулось в $ results –

0

Особенно с веб-приложений, многие люди регулярно делают отсчеты или другие скопления где-то по пути. Иногда, если это глобальный контекст, такой как все темы для всех пользователей, наличие некоторых хранимых агрегатов помогает, а не запрашивать все учетные записи каждый раз.

Пример. Если у вас есть таблица со списком «тем», у вас есть столбец для uniqueTitleCount. Затем, на основе триггера, когда новый заголовок добавляется в тему, счет автоматически обновляется путем добавления 1. Вы можете предварительно заполнить этот столбец, выполнив коррелированное обновление в указанной таблице «темы», а затем, когда триггер set, вы можете просто иметь этот столбец.

Это также работает, поскольку я вижу много раз, что люди хотят «самых последних».Если у вашей системы есть идентификаторы автоинкремента в таблицах, аналогичным образом, у вас есть самый последний идентификатор, созданный для данного вопроса или даже самый последний для данного заголовка/документа/потока, поэтому вам не нужно продолжать что-то делать.

select documentID, other_stuff 
    from sometable 
    where documentID in (select max(documentID) 
          from sometable 
          where the title = 'something') 

Использование там, где это имеет смысл, тогда вы сможете с легкостью справиться с оптимизацией. У вас может быть даже счетчик на «титул» документа и даже самая последняя дата публикации, чтобы их можно было быстро сортировать на основе интереса, частоты активности и т. Д.

+0

Вот моя текущая попытка: 'SELECT *, (SELECT count (DISTINCT (topic)) как totalTopics FROM $ tableName WHERE active = 'Active'), (SELECT count (DISTINCT (название)) как totalTitles FROM $ tableName WHERE active = 'Active') FROM $ tableName WHERE active IS NOT NULL OR active = 'Active' ORDER BY, speaker_last, title; ' Однако, когда я просматриваю свои $ results ... в конце каждой строки, я вижу следующее: – whispers

+0

Продолжение: 'foreach ($ results as $ key => $ value) {' .... etc ............. 'active: Active (SELECT count (DISTINCT (topic)) как totalTopics FROM vimeo_videos WHERE active = 'Active'): 16 (SELECT count (DISTINCT (название)) как totalTitles FROM vimeo_videos WHERE active = 'Active'): 76 ' вместо KEY .. Я вижу текст моего подзапроса? ? Как я могу получить доступ к этим значениям из «ключа», который имеет имя моего текста подзапроса? – whispers

+0

@whispers, не делайте таких комментариев. Отредактируйте исходный пост, поместите там детали, а затем просто напишите комментарий ... эй. пожалуйста, проверьте обновленное сообщение для разъяснения (или что-то подобное). В противном случае вы потеряете все преимущества форматирования и другие, чтобы увидеть доступность деталей. – DRapp