2015-04-22 34 views
2

我試圖建立使用數據的查詢從4個表:預訂,用戶,事件,地點PHP MySQL的計數事件每用戶

預訂

+---------------------------------+ 
|book_id | event_id | person_id | 
+---------------------------------+ 
|1   | 1  | 2   | 
|2   | 2  | 1   | 
|3   | 2  | 2   | 
|4   | 1  | 3   | 
|5   | 3  | 1   | 
|6   | 3  | 2   | 
+---------------------------------+ 

用戶

+----------------------+ 
| user_id | name  | 
+----------------------+ 
| 1  | Joe  | 
| 2  | Jack  | 
| 3  | Jane  | 
+----------------------+ 

活動

+------------------------+ 
| event_id | location_id | 
+------------------------+ 
| 1  | 1   | 
| 2  | 3   | 
| 3  | 1   | 
+------------------------+ 

位置

+---------------------------+ 
| location_id | name  | 
+---------------------------+ 
| 1   | Lombard  | 
| 2   | NYC   | 
| 3   | LA   | 
+---------------------------+ 

,我似乎無法寫應該讓我來顯示這樣一個表的查詢:

+------------------------------+ 
+Name  |Lombard|NYC|LA|Total| 
+------------------------------+ 
+Joe  |1  |0 |1 |2 | 
+Jack  |2  |0 |1 |3 | 
+Jane  |1  |0 |0 |1 | 
+------------------------------+ 
+Totals |4  |0 |2 |6 | 
+------------------------------+ 

我有什麼工作正在顯示每位用戶預訂了多少次,但不是每位用戶和每個位置使用此查詢預訂了多少次:

$query=' 
SELECT 
bookings.person_id, 
COUNT(bookings.person_id) AS total, 
bookings.event_id, 
users.display_name 

FROM bookings 

INNER JOIN users ON bookings.person_id=users.id 
WHERE users.id=bookings.person_id 

GROUP BY bookings.person_id'; 
$result = mysql_query($query); 
if($result) { 
while($row = mysql_fetch_array($result)) 
{ 
/* total bookings per user */ 
$value = $row['total']; 
$sum += $value; 

/* Displaying results */ 
    echo "<tr width='500'>"; 
    echo "<td>".$row['person_id']."</td>"; 
    echo "<td>".$row['display_name']."</td>"; 
    echo "<td>".$row['total']."</td>"; 
    echo "</tr>"; 
} 

這個工作好,並顯示:

+-----------------------------------+ 
| ID | NAME | Total Bookings | 
+-----------------------------------+ 
| 7  | Bob | 3    | 
| 5  | Jane | 2    | 
| 3  | Joe | 1    | 
+-----------------------------------+ 

能否請你幫我到達那裏。謝謝。

+2

請,[停止使用'mysql_ *'功能](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php )。他們不再被維護,並[正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。瞭解[準備的陳述](http://en.wikipedia.org/wiki/Prepared_statement),並使用[PDO](http://jayblanchard.net/demystifying_php_pdo.html)。 –

+1

你需要按用戶分組,按位置分組。你只在用戶上進行分組。 –

+0

看起來你需要做一個數據透視表才能得到你需要的結果 – Kisaragi

回答

0

您正在尋找數據透視表樣式查詢。這是你可以做到的一種方法。

select u.name, 
     count(case when l.name = 'Lombard' then 1 end) as lombard, 
     count(case when l.name = 'NYC' then 1 end) as nyc, 
     count(case when l.name = 'LA' then 1 end) la, 
     count(u.name) total 
    from bookings b 
    inner join events e 
     on b.event_id = e.event_id 
    inner join locations l 
     on e.location_id = l.location_id 
    inner join users u 
     on u.user_id = b.person_id 
    group by u.name 
    with rollup 

fiddle here

它得到了很多困難(和通常更容易在應用程序中做的),如果你不知道的可能的列(位置)值時,你正在寫的查詢。

+0

非常感謝你pala_。數據透視表查詢效果很好。 –

+0

很高興聽到它。如果它滿足您的問題,請您將其標記爲已接受 –

0

http://sqlfiddle.com/#!9/92d50

SELECT u.name, 
     SUM(l.name = 'Lombard') lombard, 
     SUM(l.name = 'NYC') nyc, 
     SUM(l.name = 'LA') la, 
     COUNT(*) total 
    FROM bookings b 
    LEFT JOIN `events` e 
    ON b.event_id = e.event_id 
    LEFT JOIN locations l 
    ON e.location_id = l.location_id 
    LEFT JOIN users u 
    ON u.user_id = b.person_id 
    GROUP BY u.name 
    WITH ROLLUP 
+0

非常感謝Alex。您的數據透視表查詢也很棒。 –