Mysql SQL与连接
阅读下面的内容并导航到此url以更好地了解我的问题 我一直在试图让这个问题正确的一段时间,但无法找出它。我一直在尝试连接两个表以获得正确的数据,但也许我认为我应该创建第三个表。见下面我的情况: 我有两张桌子: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
create table sites
(
id int,
websiteName varchar(50),
url varchar(50),
mobile_id varchar(50),
is_responsive varchar(1)
);
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'