将伪字段值添加到数据库查询

时间:2015-06-08 02:28:01

标签: php mysql

我想复制几个网站并将其内容合并到一个网站,类似于维基百科。我需要查询许多不同的表,这些表会变得草率。所以我想给每个表赋予$ Site和$ Section的唯一值。

一种策略是创建一个简单的脚本来查询每个表中的单个字段,如...

$stm = $pdo->prepare("SELECT GS.URL
 FROM gs_world GS
 WHERE GS.URL = :MyURL
 UNION ALL
 SELECT G.URL FROM gw2_pol G
 WHERE G.URL = :MyURL");
$stm->execute(array(
'MyURL'=>$MyURL,
));

然后我需要以某种方式修改查询,以便为每个表提供$ Site和$ Section的唯一值,如下所示:

$stm = $pdo->prepare("SELECT GS.URL, $Site AS 'GS', $Section AS 'World'
 FROM gs_world GS
 WHERE GS.URL = :MyURL
 UNION ALL
 SELECT G.URL FROM gw2_pol G, $Site AS 'GW', $Section AS 'World'
 WHERE G.URL = :MyURL");
$stm->execute(array(
'MyURL'=>$MyURL,
));

不是创建一个巨大的,绝望的复杂查询来提取其他值,而是可以进行自定义查询,放在交换机内......

switch($MySection)
{
 case 'World':
 [query]
 break;
 default:
 break;
}

无论如何,任何人都可以告诉我如何给每个表一个$ Site和$ Section的默认值,即使这两个表都没有包含这些值的字段?

知道了。这就是我认为完整的解决方案看起来像......

$stm = $pdo->prepare("SELECT GS.URL, 'GS' as Site, 'World' as Section
 FROM gs_world GS
 WHERE GS.URL = :MyURL
 UNION ALL
 SELECT G.URL, 'GW' as Site, 'World' as Section
 FROM gw2_pol G
 WHERE G.URL = :MyURL");
$stm->execute(array(
));

while ($row = $stm->fetch())
{
 $Site = $row['Site'];
 $Section = $row['Section'];
}

我现在可以使用上述值来进行更详细的查询...

switch($Section)
{
 case 'World':
  // INNER SWITCH
  switch($Site)
  {
   case 'GS':
   // [query the table gs_world]
   break;
   default:
   // [detailed query of gw2_pol]
   break;
  }
  // END INNER SWITCH
 break;
 default:
 break;
}

2 个答案:

答案 0 :(得分:1)

我认为您想要的查询只是略微修改了您的内容:

$site

我不确定变量$sectionimport java.sql.*; public class database{ Connection dbCon; Statement statement; ResultSet result; public database(){ connect(); } public void connect(){ try{ String Driver = "sun.jdbc.odbc.JdbcOdbcDriver"; Class.forName(Driver); String Sdb = "jdbc:odbc:students"; dbCon = DriverManager.getConnection(Sdb); statement = dbCon.createStatement(); String sqlQuery = "SELECT * FROM StudentInfo"; result = statement.executeQuery(sqlQuery); while(result.next()) { //String name = result.getString("Studentname"); System.out.println(result.getString("Studentname")); } }catch(Exception ex){ } } public static void main(String[] args) { System.out.println("**ACCESS DB CONNECTION**"); new database(); } } 应该是什么。

答案 1 :(得分:1)

您需要提供要返回的值,可以是文字,也可以是绑定变量。

UNION ALL(或UNION)查询中,列名由第一个查询定义。因此,您不能将结果集中列的名称用作鉴别器。要告诉哪个查询返回了一行,您需要在每个查询中使用不同的值。

此外,PDO在语句中多次重用绑定参数存在问题。这不起作用。 (至少,它以前没有用过......在以后的PDO版本中,行为可能已经改变了。)

$sql = "SELECT GS.URL
             , :gs_site     AS `site`
             , :gs_section  AS `section`
          FROM gs_world GS
         WHERE GS.URL = :gs_MyURL
         UNION ALL
        SELECT G.URL
             , :g_site      AS `site`
             , :g_section   AS `section`
          FROM gw2_pol G
         WHERE G.URL = :g_MyURL ";

$params = array(
    ':gs_MyURL'   => $MyURL,
    ':gs_site'    => 'GS',
    ':gs_section' => 'World',
    ':g_MyURL'    => $MyURL,
    ':g_site'     => 'GW',
    ':g_section'  => 'World'
    );

$stmt->prepare($sql);
$stmt->execute($params); 

如果您不想将鉴别器值作为绑定值传递,您可以将文字硬编码到SQL文本中,代替绑定占位符,例如。

$sql = "SELECT GS.URL
             , 'GS'         AS `site`
             , 'World'      AS `section`
          FROM gs_world GS
         ... ";