0

在 MySQL 数据库中,我有一些表,其中包含一些描述项目的列,以及另一个表itemExtendedFields。第二个有列:id, itemId, name, value。在itemExtendedFields中存储了有关项目的附加信息。

某些项目的到期日期可以由itemExtendedFields表的两行中保存的两个值构成。例如,对于itemId = 34 的项目,我在itemExtendedFields中有以下两行:

id | itemId | name | value
--------------------------
87 | 34 | ExpiryYear | 2014
88 | 34 | ExpiryMonth | 2

我需要编写查询,从itemExtendedFields表中的单独列中选择所有项目以及expiryYearExpiryMonth值。此外,我需要选择将在给定日期(例如 2014 年 2 月)到期的项目。我不知道如何构建正确的查询。我无法更改表格的结构。

4

3 回答 3

2

这将列出表中的所有列以及表items中的ExpiryYear和。ExpiryMonthitemExtendedFields

SELECT  a.*, b.ExpiryYear, b.ExpiryMonth
FROM    items a
        INNER JOIN 
        (
            SELECT  itemID,
                    MAX(CASE WHEN name = 'ExpiryYear' THEN `value` ELSE NULL END) ExpiryYear,
                    MAX(CASE WHEN name = 'ExpiryMonth' THEN `value` ELSE NULL END) ExpiryMonth 
            FROM    itemExtendedFields
            GROUP BY itemID
        ) b ON a.itemID = b.itemID
WHERE   b.ExpiryYear = 2012 AND 
        b.ExpiryMonth = 2
于 2013-01-03T14:50:28.733 回答
1

目前尚不清楚您要做什么,但由于您在单个列中具有值,因此首先旋转表中的数据可能更容易itemExtendedFields,然后进行类似于以下的过滤:

select *
from
(
    select i.id,
        MAX(case when f.name = 'ExpiryYear' then f.value end) ExpiryYear,
        MAX(case when f.name = 'ExpiryMonth' then f.value end) ExpiryMonth
    from item i
    left join itemExtendedFields f
        on i.id = f.itemid
    group by i.id
) src
where ExpiryYear = 2014
    and ExpiryMonth = 2

这种旋转是将存储在单列/多行中的值放入单行的多列中。可以将item表中的更多列添加到子查询,或者您可以将此子查询连接回item表以获取其他详细信息。

与此类似:

select *
from item i
left join 
(
    select f.itemid,
        MAX(case when f.name = 'ExpiryYear' then f.value end) ExpiryYear,
        MAX(case when f.name = 'ExpiryMonth' then f.value end) ExpiryMonth
    from itemExtendedFields f
    group by f.itemid
) src
   on i.id = src.itemid
where src.ExpiryYear = 2014
    and src.ExpiryMonth = 2
于 2013-01-03T14:51:22.360 回答
0
SELECT ItemId,
       MAX(CASE WHEN name = 'ExpiryYear' THEN value END) ExpiryYear,
       MAX(CASE WHEN name = 'ExpiryMonth' THEN value END) ExpiryMonth
FROM itemExtendedFields
GROUP BY itemId

SQL小提琴

于 2013-01-03T14:53:57.587 回答