Php 如何连接多个表以根据给定条件获取结果?

Php 如何连接多个表以根据给定条件获取结果?,php,mysql,sql,Php,Mysql,Sql,我看这个太久了,我的大脑感觉像意大利面条。有人能帮我问几个问题吗 表: 我想我现在需要问的基本上是“给我这个模板的所有资产和它们的位置。” 你看,当一个演示文稿被带到它面前时,它有一个特定的模板。每个模板都有指定的位置,每个位置都有一个资产或空值 我需要能够为演示使用的特定模板引入所有资产及其各自的位置我如何查询类似的内容? 我希望这对您有意义。根据您在问题中描述的内容,您需要获取给定模板的所有资产。我已经创建了表结构,但没有定义表上的关系约束,而是在制定查询时使用了它们 您可以将资产表连接到资

我看这个太久了,我的大脑感觉像意大利面条。有人能帮我问几个问题吗

表:

我想我现在需要问的基本上是“给我这个模板的所有资产和它们的位置。”

你看,当一个演示文稿被带到它面前时,它有一个特定的模板。每个模板都有指定的位置,每个位置都有一个资产或空值

我需要能够为演示使用的特定模板引入所有资产及其各自的位置我如何查询类似的内容?


我希望这对您有意义。

根据您在问题中描述的内容,您需要获取给定模板的所有资产。我已经创建了表结构,但没有定义表上的关系约束,而是在制定查询时使用了它们

您可以将
资产
表连接到
资产表示
表。通过AssetForPresentation表,您可以加入
表示
位置
表。可以通过
位置
表建立与
模板
的关系。因此,将模板表连接到资产表以获取所有匹配的记录

您可以在下面的链接中查看演示

希望有帮助

脚本:

CREATE TABLE Presentation
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE Template
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE Position
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   zorder      INT         NOT NULL 
    ,   fk_template INT         NOT NULL 
    ,   PRIMARY KEY (id)
);

CREATE TABLE Asset
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   description VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE AssetForPresentation
(
        fk_asset        INT         NOT NULL
    ,   fk_presentation INT         NOT NULL
    ,   fk_position     INT         NOT NULL
);

INSERT INTO Presentation (name) VALUES
    ('presenation 1'),
    ('presenation 2');

INSERT INTO Template (name) VALUES
    ('template 1'),
    ('template 2');

INSERT INTO Position (zorder, fk_template) VALUES
    (1, 1),
    (2, 2);

INSERT INTO Asset (name, description) VALUES
    ('asset 1', 'asset description 1'),
    ('asset 2', 'asset description 2');

INSERT INTO AssetForPresentation (fk_asset, fk_presentation, fk_position) 
VALUES
    (1, 1, 1),
    (1, 2, 1),
    (2, 2, 1),
    (2, 2, 2);

SELECT              *
FROM                Asset A
RIGHT OUTER JOIN    AssetForPresentation AP
ON                  A.id = AP.fk_asset
RIGHT OUTER JOIN    Presentation P
ON                  P.id = AP.fk_presentation
RIGHT OUTER JOIN    Position PO
ON                  PO.id = AP.fk_position
RIGHT OUTER JOIN    Template T
ON                  T.id = PO.fk_template
WHERE               T.id = 1;
输出:


根据您在问题中描述的内容,您需要获取给定模板的所有资产。我已经创建了表结构,但没有定义表上的关系约束,而是在制定查询时使用了它们

您可以将
资产
表连接到
资产表示
表。通过AssetForPresentation表,您可以加入
表示
位置
表。可以通过
位置
表建立与
模板
的关系。因此,将模板表连接到资产表以获取所有匹配的记录

您可以在下面的链接中查看演示

希望有帮助

脚本:

CREATE TABLE Presentation
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE Template
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE Position
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   zorder      INT         NOT NULL 
    ,   fk_template INT         NOT NULL 
    ,   PRIMARY KEY (id)
);

CREATE TABLE Asset
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   description VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE AssetForPresentation
(
        fk_asset        INT         NOT NULL
    ,   fk_presentation INT         NOT NULL
    ,   fk_position     INT         NOT NULL
);

INSERT INTO Presentation (name) VALUES
    ('presenation 1'),
    ('presenation 2');

INSERT INTO Template (name) VALUES
    ('template 1'),
    ('template 2');

INSERT INTO Position (zorder, fk_template) VALUES
    (1, 1),
    (2, 2);

INSERT INTO Asset (name, description) VALUES
    ('asset 1', 'asset description 1'),
    ('asset 2', 'asset description 2');

INSERT INTO AssetForPresentation (fk_asset, fk_presentation, fk_position) 
VALUES
    (1, 1, 1),
    (1, 2, 1),
    (2, 2, 1),
    (2, 2, 2);

SELECT              *
FROM                Asset A
RIGHT OUTER JOIN    AssetForPresentation AP
ON                  A.id = AP.fk_asset
RIGHT OUTER JOIN    Presentation P
ON                  P.id = AP.fk_presentation
RIGHT OUTER JOIN    Position PO
ON                  PO.id = AP.fk_position
RIGHT OUTER JOIN    Template T
ON                  T.id = PO.fk_template
WHERE               T.id = 1;
输出:


我认为您遇到困难的部分是
JOIN
assetorpresentation
表的两个条件

SELECT
  a.id,
  a.name,
  a.description
FROM Presentation AS p
JOIN Template AS t
  ON p.fk_template = t.id
LEFT JOIN Position AS pos
  ON pos.fk_template = t.id
LEFT JOIN AssetForPresentation AS afp
  ON afp.fk_presentation = p.id
  AND afp.fk_position = pos.id
LEFT JOIN Asset AS a
  ON a.id = afp.fk_asset
WHERE p.id = 123
ORDER BY pos.zorder ASC

我认为您遇到困难的部分是
JOIN
assetorpresentation
表的两个条件

SELECT
  a.id,
  a.name,
  a.description
FROM Presentation AS p
JOIN Template AS t
  ON p.fk_template = t.id
LEFT JOIN Position AS pos
  ON pos.fk_template = t.id
LEFT JOIN AssetForPresentation AS afp
  ON afp.fk_presentation = p.id
  AND afp.fk_position = pos.id
LEFT JOIN Asset AS a
  ON a.id = afp.fk_asset
WHERE p.id = 123
ORDER BY pos.zorder ASC


我在问我该如何查询这个。。。这不仅在我写的文章中有明确的表述,而且这个问题的标题很简单:“SQL:选择所有资产及其头寸”。。。简而言之,如果我在寻找“SQL”解决方案,我总是在我的标题前加上“SQL”。我不是想粗鲁,只是每个人都有有限的时间,有一个很长很模糊的问题,每个人都能更快地切入主题。如果你说“我真的不记得我想问什么了”,这是一个警告信号。很高兴其他人能够提供帮助:)我在问我如何查询这个。。。这不仅在我写的文章中有明确的表述,而且这个问题的标题很简单:“SQL:选择所有资产及其头寸”。。。简而言之,如果我在寻找“SQL”解决方案,我总是在我的标题前加上“SQL”。我不是想粗鲁,只是每个人都有有限的时间,有一个很长很模糊的问题,每个人都能更快地切入主题。如果你说“我真的不记得我想问什么了”,这是一个警告信号。很高兴其他人能够帮助我:)是的,我肯定很难做到这一点。我现在很慌乱,我甚至不知道我应该要求什么…:/结果有点过分。如果我试图将“*”的范围缩小到几个选定的字段,我会得到相当多的歧义。您希望在输出中包含什么?好的,一旦运行此查询,我希望能够从数组中提取每个位置(按zorder排序)并
echo
输出内容。所以我认为我需要的不仅仅是:资产(id、姓名等)、职位(zorder)。。。我没看错吗?@dcolombus我很高兴能帮上忙:)恐怕我不能一直回答问题,只有在我愿意的时候,我才能回答,这是。。。偶尔:)是的,我肯定很难做到这一点。我现在很慌乱,我甚至不知道我应该要求什么…:/结果有点过分。如果我试图将“*”的范围缩小到几个选定的字段,我会得到相当多的歧义。您希望在输出中包含什么?好的,一旦运行此查询,我希望能够从数组中提取每个位置(按zorder排序)并
echo
输出内容。所以我认为我需要的不仅仅是:资产(id、姓名等)、职位(zorder)。。。我没看错吗?@dcolombus我很高兴能帮上忙:)恐怕我不能一直回答问题,只有在我愿意的时候,我才能回答,这是。。。偶尔:)哇。。。感谢您在回复中付出了如此多的努力。这是一个巨大的帮助!我会仔细检查一下,确保我明白你在这里做什么。再次感谢你!所有连接都是
内部连接
s,因此您的查询假设每个位置都有一个资产。但如果某个职位没有资产,该职位将不会显示在结果集中。这似乎不符合OP的要求。好吧,最后,我希望能够将其作为数组呈现给视图。只要我能在数组上循环,如果一个位置是
empty()
NULL
,那就可以了。。。在
save()
时,不会在
AssetForPresentation
表中创建该记录。。。这看起来合乎逻辑吗?@湿婆,我相信是的。我只是想确定我说过:^以防你们两个担心我可能会使用这样的查询。@dcolombus If使用