Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL与连接_Mysql_Sql_Join - Fatal编程技术网

Mysql SQL与连接

Mysql SQL与连接,mysql,sql,join,Mysql,Sql,Join,阅读下面的内容并导航到此url以更好地了解我的问题 我一直在试图让这个问题正确的一段时间,但无法找出它。我一直在尝试连接两个表以获得正确的数据,但也许我认为我应该创建第三个表。见下面我的情况: 我有两张桌子: 网站表-列出我拥有的所有网站。我是如何创建表格的,请参见下文 create table sites ( id int, websiteName varchar(50), url varchar(50), mobile_id varchar(50), is_respons

阅读下面的内容并导航到此url以更好地了解我的问题

我一直在试图让这个问题正确的一段时间,但无法找出它。我一直在尝试连接两个表以获得正确的数据,但也许我认为我应该创建第三个表。见下面我的情况:

我有两张桌子:

  • 网站表-列出我拥有的所有网站。我是如何创建表格的,请参见下文

    create table sites
    (
      id int,
      websiteName varchar(50),
      url varchar(50),
      mobile_id varchar(50),
      is_responsive varchar(1)    
    );
    
  • Mobiles表-列出哪些网站是移动的,并且有一个移动url

    create table mobile
    (
     id int,
     mobile_url varchar(50)
    );
    
  • sites
    表和
    mobiles
    表通过名为[mobile\u id]的
    sites
    表中的外键进行关联

    [sites table]中的is_responsive列是一个位字段,其中包含一个1,表示该站点完全响应,或一个0,表示该站点没有响应

    我的目标是:
    构建一个返回所有移动网站和响应网站的查询。我试着用三张桌子,但都没用。最初,我的第三个表包含所有响应的网站,但添加另一个表没有意义。我还找到了一个使用UNION语句的解决方案,但我不想使用它

    试试这样的东西

    select *
    from sites
    left outer join mobile on sites.mobile_id = mobile.id
    where sites.is_responsive = '1' or mobile.mobile_url is not null;
    
    select sites.* from sites
    left join mobile on mobile.id = sites.mobile_id
    where (sites.is_responsive = '1' or mobile_id is not null)
    

    根据您对规格的描述。。。“所有移动网站和响应网站”

    我建议这种形式的东西可以返回您指定的结果集

    SELECT s.id
         , s.websiteName
         , s.url
         , s.mobile_id
         , s.is_responsive
         , IF(m.mobile_url IS NOT NULL,'1','0') AS is_mobile
      FROM sites s
      LEFT
      JOIN mobile m
        ON m.mobile_url = s.mobile_id 
     WHERE m.mobile_url IS NOT NULL
        OR s.is_responsive = '1'
    
    我们通常希望外键引用id列,但是如果您说您有一个外键(并且没有指定哪个列是目标列),并且外键列的数据类型为VARCHAR(50),那么我们猜测它引用的是
    mobile\u url
    列,因为这是mobile中唯一具有匹配数据类型的列

    如果目的是引用
    id
    列,则
    mobile\u id
    的数据类型应与
    id
    列的数据类型匹配,并且连接谓词应为:

        ON m.id = s.mobile_id 
    
    此外,每个表都应该有一个主键,或者至少有一个唯一的键定义在.table中

    根据您发布的内容,我将使用以下表格定义:

     CREATE TABLE mobile
     ( id           INT UNSIGNED NOT NULL PRIMARY KEY COMMENT 'PK'
     , mobile_url   VARCHAR(50)                       COMMENT 'mobile website URL'
     ) ;
    
     CREATE TABLE site
     ( id           INT UNSIGNED NOT NULL PRIMARY KEY COMMENT 'PK'
     , websiteName  VARCHAR(50)                       COMMENT 'website name'
     , url          VARCHAR(50)                       COMMENT 'website URL'
     , mobile_id    INT UNSIGNED                      COMMENT 'FK ref mobile.id'
     , is_responsive TINYINT(1) NOT NULL DEFAULT 0    COMMENT 'boolean'
     , CONSTRAINT FK_site_mobile (mobile_id) REFERENCES mobile(id)
     ) ;
    

    示例中的程序是,没有一个移动站点是响应的,但您首先编写的代码是有效的

     select sites.* from sites
     inner join mobile on sites.mobile_id = mobile.id 
     where sites.is_responsive = '1'
    

    很抱歉,请查看此url:您能否更详细地解释您的目标,或者提供一个示例数据。此链接不够?您是否需要此url上的更多示例数据“我还发现了一个使用UNION语句的解决方案,但我不想使用它。”-为什么您认为它“过度使用”?
     select sites.* from sites
     inner join mobile on sites.mobile_id = mobile.id 
     where sites.is_responsive = '1'