2012-08-04 33 views
1

我有一張表,matches,其中包含包含home_pom(匹配的主播放器)和away_pom字段的運動夾具數據。我需要調用一個查詢來查找這兩個字段中的前5個值(即,從第x季開始總共獲得比賽獎勵總數最多的5人),並且能夠輸出出現次數和玩家姓名。從兩個相似的列中選擇公共值

我沒有真正的線索從哪裏開始使用SELECT功能。

該匹配表包含一個league_id字段,該字段對應於單獨的leagues表,該表在頁面的前面調用$ league_id。目前沒有單獨的players表 - 我認爲這可能是多餘的,因爲這幾乎是我可以考慮的唯一相關的東西。

match_id | homepom | awaypom | league_id 
1  | Joe A | Jane B | 2 
2  | Joe F | Jane G | 2 
3  | Jane B | Joe F | 2 

列出喬·F和簡乙作爲具有2個POM獎項,並具有一個簡G和喬甲。

$host="cust-mysql-123-05"; // Host name 
$username="unsn_637140_0003"; // Mysql username 
$password="mypw"; // Mysql password 
$db_name="nsnetballcouk_637140_db3"; // Database name 

// Connect to server and select database. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

$areatoleaguepom=$_GET['area']; 
$seasontoleaguepom=$_GET['season']; 
$divisiontoleaguepom=$_GET['division']; 
$leaguepom_query=("SELECT league_id FROM leagues WHERE area_id='$areatoleaguepom' AND  season_id='$seasontoleaguepom' AND division_id='$divisiontoleaguepom'"); 
$leaguepom_result=mysql_query($leaguepom_query); 
$leaguepom_row=mysql_fetch_array($leaguepom_result); 
$leaguepom_id=$leaguepom_row['league_id']; 

$toppom_query=(
"SELECT 
player, 
COUNT(player) as count 
FROM (SELECT homepom AS player 
FROM matches 
WHERE league_id='$leaguepom_id' 
UNION ALL 
SELECT awaypom AS player 
FROM matches 
WHERE league_id='$leaguepom_id' 
) as players 
GROUP BY player 
ORDER BY count DESC 
LIMIT 5 
"); 

$toppom_result=mysql_query($toppom_query); 
while ($toppom_row=mysql_fetch_array($toppom_result)); 

echo $toppom_row['player'] . " " . $toppom_row['count'] . "<br>"; 

有什麼想法?

+0

你應該能夠做一些事情'計數()'和'組by',但是很難給你一個很好的回答沒有一點信息。你有一個球員表,'home_pom'和'away_pom'字段參考?你怎麼知道一場比賽是什麼賽季? – jswolf19 2012-08-04 10:32:07

+0

如果您發佈數據結構(沒有不必要的字段),一些示例數據和您想要實現的示例,您將收到更好的答案。 – user15 2012-08-04 10:35:15

+0

編輯了這個更詳細一點 - 爲朦朧道歉。 – 2012-08-04 10:42:34

回答

1

這可能是有點過於複雜,但無論如何...

SELECT 
    player, 
    COUNT(player) as count 
FROM (
    SELECT homepom AS player 
    FROM matches 
    WHERE homepom IS NOT NULL AND homepom != '' AND league_id = xxx AND other_things 
    UNION ALL 
    SELECT awaypom AS player 
    FROM matches 
    WHERE awaypom IS NOT NULL AND awaypom != '' AND league_id = xxx AND other_things 
) as players 
GROUP BY player 
ORDER BY count DESC 
LIMIT 5 

您合併home_pom和away_pom在一列,然後做一組由數誰擁有最多的。

編輯:刪除玩家表...

+0

這看起來完全像我腦子裏的樣子,我想如果我知道我在做什麼,我可能會這麼做。非常感謝。 – 2012-08-04 10:50:39

+0

如何輸出這個回顯?我使用'$ toppom_row ['player']'和'$ toppom_row ['count']' - 這個錯誤?通過'$ toppom_row =(mysql_fetch_array(mysql_query($ toppom_query)))' – 2012-08-04 11:00:54

+0

聽起來是對的,但我不知道它是否應該在沒有看到其餘代碼的情況下工作。還要確保你通過直接運行查詢獲得結果1-st(從你的mysql客戶端)。 – Vatev 2012-08-04 11:03:59

1

GREATEST(home_pom, away_pom)將返回最大爲home_pomaway_pom。所以,這樣的事情:

select * from your_table 
where season = x 
order by greatest(home_pom, away_pom) 
desc limit 5 
  • where條款採取季節x所有玩家記錄;
  • order by .. desc按您想要的排序所有玩家記錄;
  • limit 5將獲得前5名選手。
+0

有沒有辦法讓這個也可以訪問每個球員的號碼?也許與mysql_num_rows? – 2012-08-04 10:44:04

+0

在'order by'之前添加'group by player_id'子句 – Vladimir 2012-08-04 10:54:21