2015-07-14 2 views
-2

У меня есть вопрос,Комплексный запрос с использованием SQL в PHP

Мне нужно создать сложный запрос на выборку, и я не могу это:

Так что я кратные базы данных называют cluster1,cluster2,cluster3,...,cluster10,

Каждый кластер имеют столовый звонок игры. И мне нужно получить некоторые строки для всех кластеров за последние 7 дней. Я пытался так:

foreach ($aDataBases as $database) { 
    $sFlashParties = sprintf(' 
     SELECT left(depart, 10) as date, count(*) as nb 
     FROM `%s` 
     WHERE duree>0 and depart 
     BETWEEN current_date()-7 AND current_date() 
     GROUP BY date', $sFlashTableName); 
    $r_count = Mysqli::query($sFlashParties, $database); 
    $a_row = $r_count->fetch_array(MYSQLI_ASSOC); 
    error_log(print_r($a_row,true), 3, "/tmp/error.log"); 
} 

Результат должен быть:

Day  Nb_total 

Можете ли вы помочь мне, пожалуйста? Thx заранее

+0

Эти базы данных находятся на том же хосте? как вы устанавливаете соединения? Вам просто нужны строки запроса или результаты с совокупными итогами? вы используете PDO, Doctrine или что? –

+0

Не имеет значения, проблема в том, как извлекать данные ... Я использую mysql – TanGio

+0

, вопросы актуальны, прежде всего, если все базы данных находятся на одном хосте, вам нужно всего одно соединение, а затем просто выполните тот же запрос в результатах цикла и агрегата, если они распределены на разных хостах, вам нужно будет перебирать несколько соединений. Так что да, это имеет значение :) –

ответ

1

однократный подключение к хосту с несколькими базами данных, построить и выполнить строку запроса, как показано ниже.

Обратитесь к оператору обратной связи, чтобы указать местоположение database.table.

EDIT: вы просто принимая первый результат от каждого запроса, исправить, делая это:

<?php 

$databases = array("cluster1","cluster2","cluster3","cluster10"); 

foreach ($databases as $db) { 
    $sFlashtableName = '`' . $db . '`.`games`'; 
    print sprintf('SELECT left(depart, 10) as date, count(*) as nb 
     FROM %s 
     WHERE duree>0 and depart 
     BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE() 
     GROUP BY date', $sFlashtableName) . PHP_EOL; 

    // execute the query in this loop and store the results in an array 
    // parse the array later and aggregate your results 
    // $totals[] = queryresult; 

    $r_count = Mysqli::query($sFlashParties, $database); 

    while($a_row = $r_count->fetch_array(MYSQLI_ASSOC);){ 
     $rows[] = $row; // this will add every result line from all databases into one single array 
     $rows[$$db][] = $row; // not tested!, but this should give you something like similar to this $rows[cluster2] = array($a_row['date'],$a_row['nb']); 
    } 
} 

/* 
SELECT left(depart, 10) as date, count(*) as nb 
     FROM `cluster1`.`games` 
     WHERE duree>0 and depart 
     BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE() 
     GROUP BY date 
SELECT left(depart, 10) as date, count(*) as nb 
     FROM `cluster2`.`games` 
     WHERE duree>0 and depart 
     BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE() 
     GROUP BY date 
SELECT left(depart, 10) as date, count(*) as nb 
     FROM `cluster3`.`games` 
     WHERE duree>0 and depart 
     BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE() 
     GROUP BY date 
SELECT left(depart, 10) as date, count(*) as nb 
     FROM `cluster10`.`games` 
     WHERE duree>0 and depart 
     BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE() 
     GROUP BY date 
*/ 

Вы можете выбрать, что делать с результатами последующих.

+0

Thx для ответа, но я получаю данные только для 07.07.2015: 'Массив ( [дата] => 2015-07-07 [пь] => 8 ) ' – TanGio

+0

Когда я помещаю запрос в HeidiSql, я получаю данные за все дни 07.07.2015 - 14.07.2015 – TanGio

+0

Речь идет о том, как обрабатывать результаты запроса, с более подробной информацией и кодом от вас я могу попытаться помочь. –

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