2017-02-11 157 views
0

我有一个名为atp2的mysql数据库。基本上它拥有过去7年所有网球比赛的所有成绩。但每年都在不同的表格下。所以我有7张桌子。 2010年,2011年,2012年,2013年,2014年,2015年,2016年,2017年。但每次我想运行一个问题,我想一次在所有表上运行它。所以我做了这样的connection.php。从一个mysql中选择多个表

$db = new mysqli("xxx", "xxx", "xxx", "2012"); 

有没有一种方法可以在connection.php中选择所有的表格,而不必一一选择它们?所有列名在表中都是相同的。如果还有其他的方式比较简单,比如加入所有表格,我也可以这样做,但是我必须每天都能够做到这一点,因为2017年的表格每天都会更新。

根据下面的评论,我也有一个head2head.php,我想比较两名球员之间的每场比赛。

<br> 
<?php echo "Here are the matches " . $_POST[Player1] . " won vs " . $_POST[Player2]; ?> <br> 
<?php 
     $sql = <<<SQL 
     select from (SELECT * 
     FROM 2012 
     union all 
     SELECT * 
     FROM 2013 
     union all 
     SELECT * 
     FROM 2014 
     union all 
     SELECT * 
     FROM 2015 
     union all 
     SELECT * 
     FROM 2016 
     union all 
     SELECT * 
     FROM 2017) 
     WHERE t.Winner = "$_POST[Player1]" 
     AND t.Loser = "$_POST[Player2]" 
SQL; 

if(!$result = $conn->query($sql)){ 
die('There was an error running the query [' . $conn->error . ']'); 
} 

// Output the rows   
while($row = $result->fetch_assoc()){ 
echo $row[winner_name] . "-" . $row[loser_name] . "<br/>"; 
} 
?> 
+0

是的,你在使用JOINS的查询中执行此操作https://en.wikipedia.org/wiki/Join_(SQL) –

+0

考虑修改你的模式,使用一个表而不是七个 – Strawberry

回答

1

创建一个视图:

create view v_matches as 
    select 2010 as yyyy, t.* 
    from matches_2010 
    union all 
    select 2011 as yyyy, t.* 
    from matches_2011 
    union all 
    . . .; 

然后你就可以查询视图,选择所有的比赛还是仅仅一年你想要的。

注意:您在数据库中创建视图。然后您可以像访问应用程序中的表一样访问它。

实际上,您应该将所有这些信息存储在一个名为matches的表中。只需创建表格并将新信息加载到表格中,而不是为每年创建一个新表格。

+0

如果我做了一个观点,会的我上传新的2017表格时更新视图? – Heresh

+0

@新鲜。 。 。创建新表格时,您需要更新视图。 –

+0

我尝试了很多其他方法,但是这样做的窍门。 – Heresh

2

如果表是完全相同的结构(列现在的位置,名称和数据类型),你可以SE和UNION ALL

select col1, col2, col3 .... 
    from my_table2010 
    union all 
    select col1, col2, col3 .... 
    from my_table2011 
    union all 
    select col1, col2, col3 .... 
    from my_table2012 
    union all 
    select col1, col2, col3 .... 
    from my_table2013 
    union all 
    select col1, col2, col3 .... 
    from my_table2014 
    union all 
    ... 
    select col1, col2, col3 .... 
    from my_table2017 

与mysqli的

你应该做这样

// Create connection 
$conn = new mysqli($your_servername, $your_username, your_$password, $your_dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = " select col1, col2, col3 .... 
      from my_table2010 
      union all 
      select col1, col2, col3 .... 
      from my_table2011 
      union all 
      select col1, col2, col3 .... 
      from my_table2012 
      union all 
      select col1, col2, col3 .... 
      from my_table2013 
      union all 
      select col1, col2, col3 .... 
      from my_table2014 
      union all 
      select col1, col2, col3 .... 
      from my_table2015 
      union all 
      select col1, col2, col3 .... 
      from my_table2016 
      union all   
      select col1, col2, col3 .... 
      from my_table2017"; 

$result = $conn->query($sql);  

你的情况

如果您需要过滤器(在哪里),你应该使用这个sintax

<?php 
      $sql = " 
      select from (SELECT * 
      FROM 2012 
      union all 
      SELECT * 
      FROM 2013 
      union all 
      SELECT * 
      FROM 2014 
      union all 
      SELECT * 
      FROM 2015 
      union all 
      SELECT * 
      FROM 2016 
      union all 
      SELECT * 
      FROM 2017) t 
      WHERE t.Winner = " . $_POST[Player1] . " 
      AND t.Loser = " . $_POST[Player2] ; 

你错了两个原因 1-因为工会毕竟SQL需要选择,而不是在那里,,, 2 - 如果你的地方在选择的底部,你只筛选这个选择并没有统一选择

+0

我可以这样做吗?行: $ db = new mysqli(“xxx”,“xxx”,“xxx”,“2012 union all”,“2013 union all”,“2014 union all”); – Heresh

+0

回答更新..希望是明确的 – scaisEdge

+0

我试着这个,但它会引发错误。 $ SQL = <<< SQL SELECT * 自2016 WHERE赢家= “罗杰” ,败= “安迪” UNION ALL SELECT 工会* 所有 WHERE赢家= “罗杰” ,败=“Andy” SQL; – Heresh