组合多个唯一的MySQL表并按列排序,#2

时间:2014-08-02 03:44:25

标签: php mysql union

我有两个独特的表,我要做的就是组合记录并按id(即unix时间戳)对它们进行排序:

我使用互联网上最匹配的解决方案来编写此代码(并保留每个表的所有列都是唯一的):Combine multiple unique MySQL tables and order by one column

$query_ticket_entries = "   SELECT * from (
        SELECT  id AS id, id AS timeentryid, userid AS timeentryuserid,
                serviceid AS timeentryserviceid, servicerateid AS timeentryservicerateid,   
                started AS timeentrystarted, ended AS timeentryended,   
                summary AS timeentrysummary, notes AS timeentrynotes,   
                NULL AS a, NULL AS b, NULL AS c, NULL AS d          
        FROM ticket_time_entries WHERE ticketid = '$ticket_id'
        UNION
        SELECT  id AS id, NULL AS aa, NULL AS bb, NULL AS cc,   
                NULL AS dd, NULL AS ee, NULL AS ff, NULL AS gg,
                NULL AS hh, id AS noteid, userid AS noteuserid,
                typeid AS notetypeid, data AS notedata  
        FROM ticket_notes WHERE ticketid = '$ticket_id'
        ) ticket_entries ORDER BY ticket_entries.id DESC
";

我收到以下结果,该结果缺少ticket_notes表中的所有列。

SQL result

请帮助我找出问题并度过一个愉快的周末。 =))

-- phpMyAdmin SQL Dump
-- version 4.2.6
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Aug 02, 2014 at 08:53 PM
-- Server version: 5.5.38-log
-- PHP Version: 5.5.7

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `test`
--

-- --------------------------------------------------------

--
-- Table structure for table `ticket_notes`
--

CREATE TABLE IF NOT EXISTS `ticket_notes` (
  `id` int(10) NOT NULL,
  `ticketid` int(10) NOT NULL,
  `userid` int(11) NOT NULL,
  `typeid` int(2) NOT NULL,
  `data` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `ticket_time_entries`
--

CREATE TABLE IF NOT EXISTS `ticket_time_entries` (
  `id` int(10) NOT NULL,
  `ticketid` int(10) NOT NULL,
  `userid` int(10) NOT NULL,
  `serviceid` int(2) NOT NULL,
  `servicerateid` int(2) NOT NULL,
  `started` int(10) NOT NULL,
  `ended` int(10) NOT NULL,
  `summary` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `notes` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `ticket_notes`
--
ALTER TABLE `ticket_notes`
 ADD UNIQUE KEY `id` (`id`);

--
-- Indexes for table `ticket_time_entries`
--
ALTER TABLE `ticket_time_entries`
 ADD UNIQUE KEY `id` (`id`);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

1 个答案:

答案 0 :(得分:1)

UNION将行结果排列在彼此之上,因此来自包含UNION的第二个或后续查询的所有列名都不会出现。你确定你需要UNION而不是JOIN吗?

$query_ticket_entries = " 
        SELECT  tte.id AS timeentryid, tte.userid AS timeentryuserid,
                serviceid AS timeentryserviceid, servicerateid AS timeentryservicerateid,   
                started AS timeentrystarted, ended AS timeentryended,   
                summary AS timeentrysummary, notes AS timeentrynotes,   
                tn.id AS noteid, tn.userid AS noteuserid,
                typeid AS notetypeid, data AS notedata         
        FROM ticket_time_entries tte LEFT JOIN ticket_notes tn
        ON tte.ticketid=tn.ticketid
        WHERE tte.ticketid = '$ticket_id'
        ORDER BY timeentryid DESC
";

更新。好的,我得到你想要达到的目标。这似乎有点奇怪,但不过:

$query_ticket_entries = "   SELECT * from (
        SELECT  id AS id, id AS timeentryid, userid AS timeentryuserid,
                serviceid AS timeentryserviceid, servicerateid AS timeentryservicerateid,   
                started AS timeentrystarted, ended AS timeentryended,   
                summary AS timeentrysummary, notes AS timeentrynotes,   
                NULL AS noteid, NULL AS noteuserid, NULL AS notetypeid, NULL AS notedata          
        FROM ticket_time_entries WHERE ticketid = '$ticket_id'
        UNION
        SELECT  id AS id, NULL AS aa, NULL AS bb, NULL AS cc,   
                NULL AS dd, NULL AS ee, NULL AS ff, NULL AS gg,
                NULL AS hh, id AS noteid, userid AS noteuserid,
                typeid AS notetypeid, data AS notedata  
        FROM ticket_notes WHERE ticketid = '$ticket_id'
        ) ticket_entries ORDER BY ticket_entries.id DESC
";