2013-07-27 3 views
0

У меня есть запрос, который выбирает десятки строк из базы данных mysql в зависимости от даты их добавления.Ошибка запроса PDO: 2013 Потерянное соединение с сервером MySQL во время запроса [Необходимая помощь по оптимизации]

Запрос работает, но часто встречается с ошибками и неэффективен. Примечание: таблица имеет около 10k + строк.

Вот вопрос, который я Засада:

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query' in somefile.php:49 
Stack trace: 
#0 somefile.php(49): PDOStatement->execute() 

Вот запрос, который вызывает ошибку:

// Problematic Query 
$query = $conn->prepare('SELECT * 
         FROM table_name 
         WHERE DATE(date_added) IN (
          SELECT DATE(date_added) as creation_date 
          FROM table_name 
          GROUP BY creation_date DESC 
         ) 
         ORDER BY id DESC 
         LIMIT :limit OFFSET :offset' 
); 
$query->bindValue(':limit', (int) trim($entrylimit), PDO::PARAM_INT); 
$query->bindValue(':offset', (int) trim($offset), PDO::PARAM_INT); 
$query->execute(); 

есть какие-либо предложения о том, как улучшить этот запрос?

Редактировать: В попытке, надеюсь, объяснить, что это делает: Его сбор списка уникальных дат создания, а затем использование этого, чтобы собрать все строки, которые имеют определенную дату создания. (Я использовал это в php-контуре, но это было очень медленно.)

+0

Возможно ли соединение? – vee

+0

@vinodadhikary - Внутренний запрос собирает список разных дат создания, и для каждого внешнего запроса выполняется и собирает строки на основе этой даты создания. Я не настолько образован в соединении в mysql, поэтому я не уверен, что он здесь полезен. –

+0

@waterfountain Если все, что вы пытаетесь сделать, это найти строки, принадлежащие определенному create_date, почему бы вам просто не сделать 'WHERE creation_date =: date'? Или, если вы не знаете, что create_date просто забудет подзапрос и выполните 'ORDER BY creation_date' – Mike

ответ

0

попробуйте этот запрос.

$query = $conn->prepare('SELECT * , DATE(date_added) as creation_date 
          FROM table_name GROUP BY creation_date 
          ORDER BY id DESC LIMIT :limit OFFSET :offset'); 

EDIT. вы пишете DESC в одиночку без Распоряжения пунктом

изменения этого

GROUP BY creation_date DESC 
         ^^----//-Missing ORDER BY column 

в

GROUP BY creation_date 

или написать свой заказ по столбцам.

+0

Благодарим вас за попытку, но этот запрос занимает только одну строку из каждого файла create_date. Каждая дата имеет несколько строк в этой базе данных. –

+0

@waterfountain Вы назвали их оба «table_name», поэтому я бы предположил, что это всего лишь одна таблица. – Mike

+0

@Mike - Да, это всего лишь одна таблица, так что это может быть комбинированный запрос? первый запрос собирает все возможные значения create_dates, а второй собирает все строки из каждого выбранного файла create_date. –