【问题标题】:Select query from multiple tables从多个表中选择查询
【发布时间】:2012-05-20 14:20:05
【问题描述】:

我有 6 个表,需要一次从这些表中检索一些数据。任何人都可以告诉我,我可以从一个查询中选择我的值吗?

我需要这些值。

institute_id
institute_name
city_name
options (relate to institute_id) 
mediums (relate to institute_Id)

这些来自我的桌子

CREATE TABLE institutes (
    institute_id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    login_id INT(4) UNSIGNED NOT NULL,
    address_id INT(4) NOT NULL,
    contact_id INT(4) NOT NULL,
    institute_code INT(4) NOT NULL, 
    institute_name VARCHAR(80) NOT NULL, 
    institute_details VARCHAR(80) NOT NULL, 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE address (
    address_id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    address_one VARCHAR(40) NOT NULL, 
    address_two VARCHAR(40) DEFAULT NULL, 
    city_id INT(4) UNSIGNED NOT NULL,
    PRIMARY KEY (address_id),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE city(
    city_id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    city_name VARCHAR(30) NOT NULL, 
    state_id INT(2) UNSIGNED NOT NULL,
    PRIMARY KEY (city_id),
) ENGINE=MyISAM;

CREATE TABLE medium(
    medium_id INT(2) UNSIGNED NOT NULL AUTO_INCREMENT,
    medium_name VARCHAR(30) NOT NULL, 
    PRIMARY KEY (medium_id),
) ENGINE=MyISAM;


CREATE TABLE options(
    option_id INT(2) UNSIGNED NOT NULL AUTO_INCREMENT,
    option_name VARCHAR(60) NOT NULL, 
    PRIMARY KEY (option_id),
) ENGINE=MyISAM;


CREATE TABLE institute_medium(
    im_id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    medium_id INT(2) UNSIGNED NOT NULL,
    institute_id INT(4) UNSIGNED NOT NULL,
    PRIMARY KEY (im_id)
) ENGINE=MyISAM;

这些是我的桌子

我尝试过这样,但是当我尝试获取选项和媒介时我感到困惑.. instutite_medium 中总是有不止一个选项和媒介到一个机构...

$query = "SELECT 
              institute_id, institute_name, city_name, 
              DATE_FORMAT(registration_date, '%M %e, %Y') AS date
          FROM 
              institutes 
          INNER JOIN 
              address ON institutes.address_id = address.address_id
          INNER JOIN 
              city ON address.city_id = city.city_id
          ORDER BY 
              registration_date DESC";

非常感谢任何 cmets。

谢谢...

【问题讨论】:

  • 是否需要匹配特定的选项?
  • 您可以左加入机构_媒体左加入媒体,您将只获得一个机构_媒体记录,每个机构只有一个媒体记录。哪一个取决于您的 SQL 服务器。您可以在 on 子句中指定哪一个。

标签: php mysql sql


【解决方案1】:

您可以执行以下操作:

SELECT 
          institute_id, institute_name, city_name, 
          DATE_FORMAT(registration_date, '%M %e, %Y') AS date,
          GROUP_CONCAT(mediums.name SEPARATOR ', ')
      FROM 
          institutes 
      INNER JOIN 
          address ON institutes.address_id = address.address_id
      INNER JOIN 
          city ON address.city_id = city.city_id
      LEFT JOIN 
          institute_medium ON institutes.institute_id = institute_medium.institute_id
      LEFT JOIN 
          medium ON institute_medium.medium_id = medium.medium_id
      ORDER BY 
          registration_date DESC

GROUP_CONCAT(mediums.name SEPARATOR ', ') 基本上会内爆所有媒体名称。

您可以删除组 concat 并使用 mediums.names 并使用右连接,然后您将多次拥有同一行,唯一的变化是媒体名称

【讨论】:

  • 使用此查询.. 查询失败并说字段列表中的列“'institute_id' 不明确”然后我从查询中删除了 Institute_id 并再次运行,然后我只能得到 1 行。为什么????我的数据库中有很多数据...
  • 模棱两可的错误意味着当您使用连接时,您必须在 SELECT 列表中的所有列前面加上 table_name 前缀。许多表的列名称相同,出现歧义。
  • 这一行是因为我使用了 GROUP_CONCAT 但我没有指定要 GROUP BY 的内容,在这种情况下你应该 GROUP BY mediums.medium_id。
  • 再次,结果只有 1 行。
  • 抱歉,“me​​dium”当然是 SQL 中没有“自动复数形式”,所以只使用您专门创建的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2013-11-12
  • 2023-03-20
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多