如何获取与另一个表中的多行相关的行?

时间:2013-06-08 09:00:39

标签: mysql sql select

我有一些表格:

ws_shop_product

CREATE TABLE `ws_shop_product` (
     `product_id` int(10) unsigned NOT NULL AUTO_INCREMENT
     `product_title` varchar(255) COLLATE utf8_general_ci DEFAULT NULL,
 PRIMARY KEY (`product_id`)
) ENGINE=MyISAM AUTO_INCREMENT=14499 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

ws_system_admin

CREATE TABLE `ws_system_admin` (
     `admin_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `admin_username` varchar(255) NOT NULL,
     `admin_password` char(40) NOT NULL,
 PRIMARY KEY (`admin_id`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

ws_shop_product更新的

CREATE TABLE `ws_shop_product-updated` (
     `updated_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `updated_product` int(10) unsigned DEFAULT NULL,
     `updated_admin` int(10) unsigned DEFAULT NULL,
     `updated_date` datetime DEFAULT NULL,
 PRIMARY KEY (`updated_id`),
 KEY `updated_product` (`updated_product`),
 KEY `updated_admin` (`updated_admin`)
) ENGINE=MyISAM AUTO_INCREMENT=42384 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

每当CMS中的product更改为一行时 将插入保留的ws_shop_product-updated admin ID,product ID和date

一些数据:

product_id    product_title
----------    -------------
         1    iPhone 5     


updated_product    updated_admin    updated_date
---------------    -------------    ------------
              1              301    2013-04-13 00:00:00
              1              302    2013-04-15 00:00:00
              1              303    2013-04-16 00:00:00


现在我的问题是:如何获取包含最新更新信息的产品?

product_id    product_title    latest_admin_id    latest_date
----------    -------------    ---------------    -----------
         1    iPhone 5         303                2013-04-16 00:00:00

3 个答案:

答案 0 :(得分:0)

你可以使用这样的查询:

SELECT
  p.product_id,
  p.product_title,
  u.updated_admin latest_admin_id,
  u.updated_date latest_date
FROM
  `ws_shop_product-updated` u INNER JOIN ws_shop_product p
  ON u.updated_product = p.product_id
WHERE
  (u.updated_product, u.updated_date) IN
  (SELECT   updated_product, MAX(updated_date)
   FROM     `ws_shop_product-updated`
   GROUP BY product_id)

请参阅小提琴here

子查询将返回每个产品的最大updated_date,外部查询将返回每个产品具有最大updated_date的所有行的所有列。

答案 1 :(得分:0)

因为您使用的是mysql,所以您可以使用mysql的特殊(和非可移植)功能组来生成这个相当简单的查询:

SELECT * FROM (
  SELECT p.product_id, p.product_title,
    u.updated_admin latest_admin_id, u.updated_date latest_date
  FROM ws_shop_product p
  LEFT JOIN `ws_shop_product-updated` u ON u.updated_product = p.product_id
  ORDER BY u.updated_date DESC) x
GROUP BY 1

此查询将返回所有产品,即使它们在“已更新”表中没有行 - 当没有这样的行时,返回“最新”列的null值。

这个工作的原因是(对于mysql而言)当并非所有非聚合列都在group by中命名时,mysql返回为每个名称的唯一值组合找到的 first 行在group by子句中。通过在subquery latest-first中排序数据,为每个product_id找到的第一行将是最新的。

答案 2 :(得分:-1)

你可以试试这个:

      WITH    CTE ( PRODUCTID, PRODUCT_TITLE )
                  AS ( SELECT   *
                       FROM     dbo.ws_shop_product
                     ),
                CTE2 ( updated_id, updated_product, updated_admin, updated_date, ROW )
                  AS ( SELECT   * ,
                                ROW = ROW_NUMBER() OVER ( PARTITION BY UPDATED_PRODUCT ORDER BY UPDATED_DATE DESC )
                       FROM     dbo.ws_shop_productupdated
                     )
            SELECT  A.* ,
                    B.UPDATED_ADMIN ,
                    UPDATED_DATE
            FROM    CTE A
                    JOIN CTE2 B ON A.PRODUCTID = B.UPDATED_PRODUCT
            WHERE   ROW = 1