【问题标题】:Combine SQL query [duplicate]组合 SQL 查询 [重复]
【发布时间】:2012-06-20 23:30:31
【问题描述】:

可能重复:
What is the difference between Join and Union?

我们如何将单独的查询组合成一条 sql 语句?示例:

SELECT packageid FROM tblhosting WHERE id='$id' AND userid='$userid'
SELECT id FROM tblcustomfields WHERE relid=tblhosting.packageid AND fieldname='foo'
SELECT value FROM tblcustomfieldsvalues WHERE fieldid=tblcustomfields.id AND relid='$id'

现在,我知道嵌套查询,所以我可以这样写:

但我想知道是否有更好的方法来编写此查询?

[更新2] 这是一个没有变量的版本,希望这次更清楚

SELECT packageid FROM tblhosting WHERE id='$id' AND userid='$userid'
SELECT id FROM tblcustomfields WHERE relid=tblhosting.packageid AND fieldname='foo'
SELECT value FROM tblcustomfieldsvalues WHERE fieldid=tblcustomfields.id AND relid='$id'

这里我只对tblcustomfieldvalues.value感兴趣

【问题讨论】:

  • 在最初发布问题后,如果名称和变量发生微小变化,很难提供“好的”答案。
  • @imm 现已修复,抱歉

标签: mysql sql query-optimization


【解决方案1】:

您可以根据需要使用INNER or LEFT JOIN

SELECT  c.value
  FROM  tblhosting a INNER JOIN tblcustomfields b
            ON b.relid = a.packageid
        INNER JOIN tblcustomfieldsvalues c
            ON c.fieldid = b.id
 WHERE  a.id = '$id'  AND   
        a.userid = '$userid' AND 
        b.fieldname = 'foo'

【讨论】:

  • 这个查询工作正常,除了它返回多个不同的记录,但如果我运行 3 个单独的查询,它返回一个唯一的记录。
  • 我已经更新了答案。我删除了这两列,因为您只需要此列:tblcustomfieldvalues.value 对吗?
【解决方案2】:

怎么样:

SELECT h.packageid, cf.id, cfv.value
FROM tblhosting h
INNER JOIN tblcustomfields cf ON (cf.relid = h.packageid)
INNER JOIN tblcustomfieldsvalues cfv ON (cfv.fieldid = cf.id)
WHERE h.id = '$serviceid'
  AND h.userid = '$userid'
  AND cf.fieldname = 'foo'

【讨论】:

    【解决方案3】:

    如果您只想从所有三个表中获取所有三个表中都存在行的行,这就是我假设您想要的,SQL 看起来像这样:

    select
        a.id,
        b.value,
        c.packageid
    from
        tbcustomfields a,
        tblcustomfieldsvalues b,
        tblhosting c
    where
        c.userid='$userid'
        and a.relid=b.relid
        and a.relid=c.packageid
        and a.fieldname='foo'
        and b.fieldid=c.id
    

    【讨论】:

    • 请尽可能使用 ANSI 连接。
    【解决方案4】:
    SELECT
      tblcustomfieldvalues.value
    FROM tblhosting
      LEFT JOIN tblcustomfields
        ON tblcustomfields.relid = tblhosting.packageid
          AND tblcustomfields.fieldname = 'foo'
      LEFT JOIN tblcustomfieldsvalues
        ON tblcustomfieldsvalues.fieldid = tblcustomfields.id
          AND relid = '$id'
    WHERE tblhosting.id = '$id'
        AND tblhosting.userid = '$userid'
    

    试试这个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多