【问题标题】:MYSQL : Selecting from Multiple Databases (an error occured) [duplicate]MYSQL:从多个数据库中选择(发生错误)[重复]
【发布时间】:2014-02-28 09:10:24
【问题描述】:

我在同一台服务器上有三个数据库。它们是margoplatinumdetosplaza。 它们也具有相同的表结构。其中一张表称为movie。 下面是movie表的表结构:

id_movie     int(11) PK, AI;
movie_title  varchar(100);
status       varchar(30);

movie 表中来自margoplatinum 的数据为:

id_movie   |     movie_tittle     |     status
--------------------------------------------------
    1      |     Frozen           |   Now Playing
    2      | The-Amazing-Spidey2  |   Coming Soon

movie 表中来自detos 的数据是:

 id_movie   |     movie_tittle     |     status
--------------------------------------------------
    1      |     Comic8           |   Now Playing
    2      |     Godzilla         |   Coming Soon

movie 表中来自plaza 的数据是:

id_movie   |     movie_tittle     |     status
--------------------------------------------------
    1      |     The Killer       |   Now Playing
    2      |     Godzilla         |   Coming Soon

所以我想做的是从上面的三个数据库中选择(在我的 php 代码中并将其转换为 JSON)用于表电影,其中 status = "Now Playing"..

这是我的 php 代码:

<?php

 $db_host  = "127.0.0.1";

 $db_uid  = "root";

 $db_pass = "";

 $db_con = mysql_connect($db_host,$db_uid,$db_pass) or die('could not connect');

 $q = mysql_query('SELECT DISTINCT a.id_movie, b.id_movie, c.id_movie, a.movie_tittle, 
                  b.movie_tittle, c.movie_tittle FROM `margoplatinum`.movie a 
                  INNER JOIN `detos`.movie b ON a.id_movie = b.id_movie 
                  INNER JOIN `plaza`.movie c ON b.id_movie = c.id_movie
                  WHERE a.status = "Now Playing"');
 $v = '{"info" : [';

 while($r=mysql_fetch_array($q))
   {
$ob = array("<br>","<b>","</b>");
if(strlen($v)<12)
    {
    $v .= '{"id_movie" : "'.$r['id_movie'].'", "movie_tittle" : 
             "'.$r['movie_tittle'].'"}';
    }
else
    {
    $v .= ',{"id_movie" : "'.$r['id_movie'].'", "movie_tittle" :
            "'.$r['movie_tittle'].'"}';
    }

    }
  $v .= ']}';
  echo $v;
  echo mysql_error();
  mysql_close();

    ?>

但是当我执行上面的php时,发生了错误..这是错误消息:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\CinemaInfo\list_movie.php on line 17 {"info" : []}Unknown column 'a.status' in 'where clause'

我上面的查询是否正确?或者我的查询做错了什么.. 任何人都可以根据我上面的案例帮助我编写正确的查询吗? 我真的很感谢你的帮助。 谢谢你:)

【问题讨论】:

  • 不确定这是否不正确,但您为什么要给 FROM 'margoplatinum'.movie a ?不应该只是表名FROM margoplatinum a
  • margoplatinum是一个数据库名,如果我想同时连接三个数据库,我必须在table.field之前声明数据库名:)
  • 在旁注中,您应该考虑创建 PHP 结果数组,然后使用 json_encode() 将其转换为 JSON,而不是手动创建它。然后,在客户端,您只需 json_decode() 即可取回相同的 PHP 数组。
  • @Fanis 谢谢你的评论:)

标签: php mysql json inner-join multiple-databases


【解决方案1】:

我认为你需要的是 UNION 而不是 JOIN,join 操作会找到 ID 相同但名称不同的电影。

所以,我会选择:

正如您提到的,您只需要两列,这就是您所需要的。

select id_movie, movie_tittle
  from 
   (
   select id_movie, movie_tittle, status
     from `margoplatinum`.movie
    UNION
   select id_movie, movie_tittle, status
     from `detos`.movie
    UNION
   select id_movie, movie_tittle, status
     from `plaza`.movie
   ) as a
where a.status = 'Now Playing'

【讨论】:

  • 等等..我试一试..我会回来报告结果:)
  • 对不起,它仍然无法正常工作..它再次出现错误,例如:Unknown column 'a.status' in 'where clause' at line 2` :(
  • 先生,我只想显示电影表中的 2 个字段,所以我没有在代码中写 status 字段..它会影响我的结果吗?
  • 是的,它是...您必须至少在 UNIONs 查询中有状态字段才能过滤外部。
  • @Aprilia 我已经编辑了我的答案。
【解决方案2】:

首先通过直接在 mysql 查询编辑器中运行它来确保您的查询正常工作。

如果它正在工作,那么使用 php 执行查询的方式有问题。

以下查询对我有用

select a.id from `test1`.app_user a 
inner join `test2`.app_user r on r.id=a.id 
inner join `test`.app_user f on a.id=f.id 
where a.Status="ACTIVE"

所以,我猜列名可能不同或类似

【讨论】:

  • 这应该是一条评论。
  • 是的......查询不正确..这是警告:Unknown column 'a.status' in 'where clause'
  • @JorgeCampos 我很乐意发表评论,但我不能因为声誉低下:)
  • @Aprilia 那么该列可能以某种方式丢失了
  • 是的,但我不知道在哪里以及如何:(
【解决方案3】:

最好有一个数据库来处理这个问题。表结构可以是:

CREATE TABLE `movies` (
id_movie INT AUTO_INCREMENT,
movie_title VARCHAR(50),
  PRIMARY KEY( id_movie )
);

CREATE TABLE `locations` (
  id_movie_fk INT,
  location VARCHAR(50),
  STATUS VARCHAR(25)
);

我已经设置了sqlFiddle example

【讨论】:

  • 是的,这样会更好..但出于某种原因,我必须创建三个数据库..:)
【解决方案4】:

尝试更改以下查询:

 $q = mysql_query("SELECT DISTINCT a.id_film, b.id_film, c.id_film, a.judul_film, 
                  b.judul_film, c.judul_film FROM `margoplatinum`.film a 
                  INNER JOIN `detos21`.film b ON a.id_film = b.id_film 
                  INNER JOIN `depokplaza21`.film c ON b.id_film = c.id_film
                  WHERE a.status = 'Now Playing'");

SQL 中的字符串使用简单的 ' 不是双精度的"

【讨论】:

  • 我已经尝试过了,但它给出了另一个错误Parse error: syntax error, unexpected 'Now' (T_STRING) in C:\xampp\htdocs\CinemaInfo\list_movie.php on line 14 .. 我该怎么办? :(
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 2018-02-20
  • 2010-10-25
  • 2015-06-30
  • 1970-01-01
  • 2018-07-03
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多