1

私はいくつかのテーブルを持っています:

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-updated

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 で が変更されるたびに、 ID、ID、およびを保持するproductに 1 つの行が挿入されます。ws_shop_product-updatedadminproductdate

いくつかのデータ:

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
4

3 に答える 3

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)

ここでフィドルを参照してください。

サブクエリは各製品の最大の updated_date を返し、外側のクエリはすべての製品の最大の updated_date を持つすべての行のすべての列を返します。

于 2013-06-08T09:51:43.287 に答える
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 はgroup by 句で指定された列の値の一意の組み合わせごとに見つかった最初の行を返すためです。サブクエリ内のデータを最新順で並べ替えると、各 product_id で見つかった最初の行が最新になります。

于 2013-06-08T10:25:30.013 に答える
-1

これを試すことができます:

      WITH CTE ( PRODUCTID, PRODUCT_TITLE )
                  AS ( 選択 *
                       FROM dbo.ws_shop_product
                     )、
                CTE2 (updated_id、updated_product、updated_admin、updated_date、ROW)
                  AS ( 選択 * ,
                                ROW = ROW_NUMBER() OVER ( PARTITION BY UPDATED_PRODUCT ORDER BY UPDATED_DATE DESC )
                       FROM dbo.ws_shop_productupdated
                     )
            を選択。* 、
                    B.UPDATED_ADMIN、
                    UPDATED_DATE
            CTE A から
                    A.PRODUCTID = B.UPDATED_PRODUCT で CTE2 B に参加
            どこ行 = 1         
于 2013-06-08T10:38:44.360 に答える