【问题标题】:Select from two table than order it从两个表中选择而不是订购
【发布时间】:2012-03-19 12:54:35
【问题描述】:

我有 4 个表,default_table、table_a、table_b、table_c,每个都有两列,
我想从所有表中选择nameid 然后对其进行排序,
我试试"SELECT Name,ID FROM default_table, table_a, table_b, table_c ORDER BY Name"
但这给了我错误,所以有人可以帮我解决这个问题,我需要 sql 或 php 中的代码,或者如果可以的话,甚至需要 javascript

【问题讨论】:

  • Javascript 是一种客户端技术,因此不能真正与 mysql 直接交互。您遇到什么错误,因为这对我们有帮助?
  • SELECT Error Name is ambiguos 之类的
  • 那是因为你在多个表中有相同的列名,所以数据库不知道你想要哪一列

标签: php mysql


【解决方案1】:

由于order by是在联合后应用的,你可以这样做:

select id, name from default_table
    union all select id, name from table_a
    union all select id, name from table_b
    union all select id, name from table_c
order by name

您的问题是您正在对所有表数据进行笛卡尔积,因此无法确定 哪个 idname 您的意思。即使可以,由于乘法效应,您获得的行数也会比您预期的多方式。您只想通过添加所有行到输出来连接数据。


进一步解释区别,假设您有两个表:

table1          table2
======          ======
id     name     id     name
--     ----     --     ------
 1     pax       1     jill
 2     bob       2     debbie
 3     joe

查询:

select a.id, a.name, b.id, b.name from table1 a, table2 b

(笛卡尔积)会给你:

1 pax 1 jill
1 pax 2 debbie
2 bob 1 jill
2 bob 2 debbie
3 joe 1 jill
3 joe 2 debbie

(行数是各个行数的乘积)而:

select id, name from table1
union all
select id, name from table2

(工会)会给你:

1 pax
2 bob
3 joe
1 jill
2 debbie

(行数是各个行数的总和)。

【讨论】:

    【解决方案2】:

    我猜你需要UNION(或UNION ALL):

    SELECT *
    FROM
      ( SELECT Name, ID 
        FROM default_table
      UNION ALL
        SELECT Name, ID 
        FROM table_a
      UNION ALL
        SELECT Name, ID 
        FROM table_b
      UNION ALL
        SELECT Name, ID 
        FROM table_c
      ) AS un
    ORDER BY Name
    

    【讨论】:

    • 顺便说一句,这里不需要子选择。
    • @paxdiablo:你是对的。我不确定。如果您将子选择括在括号中,您甚至可以将 order by 应用于子选择并将 order by 应用于联合。
    【解决方案3】:

    试试这样的

    SELECT 
        t1.name AS t1_name, t1.id AS t1_id, 
        t2.name AS t2_name, t2.id AS t2_id, 
        t3.name AS t3_name, t3.id AS t3_id, 
        t4.name AS t4_name, t4.id AS t4_id
    FROM 
        default_table AS t1,
        table_a AS t2,
        table_b AS t3,
        table_c AS t4
    ORDER BY t1.name
    

    【讨论】:

    • 你没有加入表格,这将产生交叉产品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    相关资源
    最近更新 更多