Php 使用SQL将2个结果合并为1

Php 使用SQL将2个结果合并为1,php,mysql,sql,Php,Mysql,Sql,有点麻烦,我有一个复杂的查询,它返回2个结果,这很好,但我想修改查询,使其合并2个结果并返回1个结果。我想知道这是否有可能。我举的例子是: SELECT s.f_Name s.l_Name, t.tour_Name, o.order_Placed, s.staff_ID, t.tour_ID, d.date FROM Staff_Day AS d, Tour as t, Staff AS s, Customers AS c JOIN Orders AS o ON

有点麻烦,我有一个复杂的查询,它返回2个结果,这很好,但我想修改查询,使其合并2个结果并返回1个结果。我想知道这是否有可能。我举的例子是:

SELECT s.f_Name s.l_Name, t.tour_Name, o.order_Placed, s.staff_ID, t.tour_ID, d.date
        FROM Staff_Day AS d, Tour as t, Staff AS s, Customers AS c
        JOIN Orders AS o ON c.customer_ID = o.order_No
        WHERE c.date >= '2014-03-18 00:00:00' AND c.date <= '2014-03-19 23:59:59'
        AND d.tour_ID = c.trip_Taken
        AND t.tour_ID = d.tour_ID
        AND d.date = c.date
        AND d.staff_ID = s.staff_ID
        ORDER BY d.staff_ID ASC

是的,在MySQL中可以做到这一点但是

您确实不想这样做

这最好在PHP的过程逻辑中处理。获取两行,然后将它们组合成所需的输出

作为在MySQL中实现此功能的演示:

SELECT t.*
  FROM ( SELECT @prev_fee           AS fee_r1
              , @prev_fee := s.fee  AS fee_r2
              , @prev_fi            AS fi_r1
              , @prev_fi  := s.fi   AS fi_r2
              , @prev_fo            AS fo_r1
              , @prev_fo  := s.fo   AS fo_r2
           FROM (
                  SELECT 'a' AS fee, '1' AS fi, 'apple' AS fo
                   UNION ALL
                  SELECT 'c','3','cat'
                   UNION ALL
                  SELECT 'e','5','egg'
                   UNION ALL
                  SELECT 'b','2','bad'
                  ORDER BY 1
                ) s
          CROSS
           JOIN ( SELECT @prev_fee := NULL
                       , @prev_fi  := NULL
                       , @prev_fo  := NULL
                ) i
          LIMIT 2
       ) t
 LIMIT 1,1
原始查询将替换别名为
s
的内联视图查询。您需要为查询返回的每一列定义用户变量,并使用这些变量“保存”上一行的值


在别名为
t
的内联视图中,在将用户变量设置为当前行的值之前,需要将上一行中保存的值显示在选择列表中。如果需要对列进行重新排序,则需要在最外层的查询中执行此操作。

在哪个数据库上运行此操作?可能最好在PHP中处理这两行以创建要查找的数据。如果需要处理两行以上的数据,SQL很快就会变得混乱。这两行有共同点吗?您可以将表本身连接起来(或将其加倍作为子选择),并获得与您所追求的形状相似的形状。我对我们的股票交易表进行了类似的查询,并将一个交易表本身连接起来,以便在一行中同时获得买入和卖出的详细信息。但我同意这不适用于任意n个联接。我知道@user113215是什么意思,但当我使用while循环在页面上显示它时,我有两行,而我只需要一行!我只需要显示日期、2名工作人员和参观情况。@Akiradaws在进行多个较小的查询时可能会更好。例如,一个查询用于获取旅游信息,另一个查询用于获取员工列表(即使此列表“始终”包含两个姓名),等等。
SELECT t.*
  FROM ( SELECT @prev_fee           AS fee_r1
              , @prev_fee := s.fee  AS fee_r2
              , @prev_fi            AS fi_r1
              , @prev_fi  := s.fi   AS fi_r2
              , @prev_fo            AS fo_r1
              , @prev_fo  := s.fo   AS fo_r2
           FROM (
                  SELECT 'a' AS fee, '1' AS fi, 'apple' AS fo
                   UNION ALL
                  SELECT 'c','3','cat'
                   UNION ALL
                  SELECT 'e','5','egg'
                   UNION ALL
                  SELECT 'b','2','bad'
                  ORDER BY 1
                ) s
          CROSS
           JOIN ( SELECT @prev_fee := NULL
                       , @prev_fi  := NULL
                       , @prev_fo  := NULL
                ) i
          LIMIT 2
       ) t
 LIMIT 1,1