【问题标题】:Filtering query with multiple and dynamic properties in Eav Model在 Eav 模型中过滤具有多个和动态属性的查询
【发布时间】:2018-12-01 10:24:17
【问题描述】:

我有 5 张桌子

Advertismenet > 在我的应用程序中有一些广告

类别

category Detail > 用于类别的属性

类别详细定义>用于类别详细定义

类别详细值> 用于提交

我想实现 EAV 模型。 例如我有这个示例数据。

分类

  • 编号 1
  • 命名手机

分类详情

    • 编号 1
      • 名称价格
      • 类别 ID 1
      • 控制类型字符串
    • ID 2
      • 命名内存
      • 类别 ID 1
      • ControlType 下拉菜单
    • ID 3
      • 硬命名
      • 类别 ID 1
      • 控件类型编号

类别详细定义

    • 编号 1
      • 命名4G
      • CategoryDe​​tailId 2
    • ID 2
      • 命名8G
      • CategoryDe​​tailId 2

广告网

    • 编号 1
      • 命名三星银河
      • 类别 ID 1
    • ID 2
      • 命名三星银河
      • 类别 ID 1

详细价值

    • 编号 1
      • 广告 ID 1
      • DetailId 1
      • 价值530000
      • DefinitionId 为空
    • 编号 1
      • 广告 ID 1
      • DetailId 2
      • 值为空
      • 定义 ID 1

所以我想要一个过滤页面,用户可以选择他/s想要的属性。例如,我作为用户想要一个具有 8G 内存的手机列表,它们是黑色的,....

更新:

CREATE TABLE Advertisement_Categories([Id] [bigint] IDENTITY(1,1) NOT NULL)
CREATE TABLE Advertisement_CategoryDetail_Definitions(
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Advertisement_CategoryDetailId] [bigint] NOT NULL,
[Name] [nvarchar](max) NULL)
CREATE TABLE Advertisement_CategoryDetail_Values(
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Advertisement_CategoryDetailId] [bigint] NOT NULL,
[AdvertisementId] [bigint] NULL,
[Advertisement_CategoryDetail_DefinitionId] [bigint] NULL,
[Value] [nvarchar](max) NULL)
CREATE TABLE Advertisement_CategoryDetails(
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
[DynamicUserControlType] [int] NOT NULL,
[Advertisement_CategoryId] [bigint] NOT NULL)

CREATE TABLE Advertisements(
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Advertisement_CategoryId] [bigint] NOT NULL)

INSERT [dbo].[Advertisement_Categories] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Name], [IconPath], [OrderNumber], [ParentId]) VALUES (4, CAST(N'2018-12-01T07:06:50.2165209+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, N'طلا', NULL, 0, 3)
INSERT [dbo].[Advertisement_CategoryDetail_Definitions] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Advertisement_CategoryDetailId], [Name], [OrderNumber], [Version]) VALUES (1, CAST(N'2018-12-01T07:07:08.8619579+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, 1, N'عیار ۱۸', 0, 636792448288619526)
INSERT [dbo].[Advertisement_CategoryDetail_Definitions] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Advertisement_CategoryDetailId], [Name], [OrderNumber], [Version]) VALUES (2, CAST(N'2018-12-01T07:08:15.2481173+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, 2, N'سفید', 0, 636792448952481159)
INSERT [dbo].[Advertisement_CategoryDetail_Definitions] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Advertisement_CategoryDetailId], [Name], [OrderNumber], [Version]) VALUES (5, CAST(N'2018-12-01T07:07:08.8619579+00:00' AS DateTimeOffset), CAST(N'2018-12-01T07:07:08.8619579+00:00' AS DateTimeOffset), 0, 1, N'عیار 24', 0, 0)
INSERT [dbo].[Advertisement_CategoryDetail_Definitions] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Advertisement_CategoryDetailId], [Name], [OrderNumber], [Version]) VALUES (6, CAST(N'2018-12-01T07:08:15.2481173+00:00' AS DateTimeOffset), CAST(N'2018-12-01T07:08:15.2481173+00:00' AS DateTimeOffset), 0, 2, N'زرد', 0, 0)
INSERT [dbo].[Advertisement_CategoryDetail_Definitions] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Advertisement_CategoryDetailId], [Name], [OrderNumber], [Version]) VALUES (7, CAST(N'2018-12-01T07:08:15.2481173+00:00' AS DateTimeOffset), CAST(N'2018-12-01T07:08:15.2481173+00:00' AS DateTimeOffset), 0, 2, N'سیاه', 0, 0)
INSERT [dbo].[Advertisement_CategoryDetail_Values] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Advertisement_CategoryDetailId], [AdvertisementId], [Advertisement_CategoryDetail_DefinitionId], [Value], [Version]) VALUES (1, CAST(N'2018-12-01T07:15:22.5333139+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, 1, 11, 1, NULL, 636792453225333028)
INSERT [dbo].[Advertisement_CategoryDetail_Values] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Advertisement_CategoryDetailId], [AdvertisementId], [Advertisement_CategoryDetail_DefinitionId], [Value], [Version]) VALUES (2, CAST(N'2018-12-01T07:15:22.5333183+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, 2, 11, 2, NULL, 636792453225333183)
INSERT [dbo].[Advertisement_CategoryDetail_Values] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Advertisement_CategoryDetailId], [AdvertisementId], [Advertisement_CategoryDetail_DefinitionId], [Value], [Version]) VALUES (3, CAST(N'2018-12-01T07:15:22.5333183+00:00' AS DateTimeOffset), CAST(N'2018-12-01T07:15:22.5333183+00:00' AS DateTimeOffset), 0, 2, 10, 6, NULL, 0)
INSERT [dbo].[Advertisement_CategoryDetails] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Name], [IsRequired], [DynamicUserControlType], [OrderNumber], [Advertisement_CategoryId], [Version]) VALUES (1, CAST(N'2018-12-01T07:06:57.5101115+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, N'عیار', 0, 3, 0, 4, 636792448175100972)
INSERT [dbo].[Advertisement_CategoryDetails] ([Id], [CreateDate], [UpdateDate], [IsArchived], [Name], [IsRequired], [DynamicUserControlType], [OrderNumber], [Advertisement_CategoryId], [Version]) VALUES (2, CAST(N'2018-12-01T07:08:04.5508379+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, N'رنگ', 0, 3, 1, 4, 636792448845508373)
INSERT [dbo].[Advertisements] ([Id], [CreateDate], [UpdateDate], [IsArchived], [OwnerUserId], [ProcessState], [SellKind], [Address], [Longitude], [Latitude], [Title], [Price], [DiscountPercent], [Warranty], [Description], [Advertisement_CategoryId], [ProvinceId], [CityId], [PointKind]) VALUES (10, CAST(N'2018-11-28T13:04:29.3749610+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, 1, 0, 0, N'1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA', -122.08400000000002, 37.421998333333335, N'ghfgh', CAST(65465436.00 AS Decimal(18, 2)), 0, NULL, NULL, 2, 1, 1, 2)
INSERT [dbo].[Advertisements] ([Id], [CreateDate], [UpdateDate], [IsArchived], [OwnerUserId], [ProcessState], [SellKind], [Address], [Longitude], [Latitude], [Title], [Price], [DiscountPercent], [Warranty], [Description], [Advertisement_CategoryId], [ProvinceId], [CityId], [PointKind]) VALUES (11, CAST(N'2018-12-01T07:15:20.4668455+00:00' AS DateTimeOffset), CAST(N'0001-01-01T00:00:00.0000000+00:00' AS DateTimeOffset), 0, 1, 0, 0, N'1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA', -122.08400000000002, 37.421998333333335, N'dfgsfdg', CAST(225000000.00 AS Decimal(18, 2)), 0, NULL, NULL, 4, 1, 1, 2)

如何选择具有多个过滤器的广告列表 请记住,每个属性都在一行上,所以我不能只使用“和”

【问题讨论】:

  • 一个WHERE 可以有多个子句,而不仅仅是一个。 WHERE Column1 = 'A' and Column2 = 2 完全有效;您不仅限于 1 个子句。
  • 我无法真正弄清楚这个数据模型。以表格格式保存数据真的很有帮助。
  • @Larnu 我不能这样做,因为每一行都只有一个属性而不是所有属性
  • 这不是我从你的描述中得到的可视化。 @GordonLinoff 是对的,我们这里需要表格格式的数据;甚至更好的 DDL (CREATE) 和 DML (INSERT) 语句。
  • 我刚刚添加了一些脚本来配合@Larnu

标签: sql sql-server entity-attribute-value


【解决方案1】:

此查询可能会有所帮助

select * from Advertisements where 
exists (select AdvertisementId from Advertisement_CategoryDetail_Values where  AdvertisementId = Advertisements.id  and  Advertisement_CategoryDetailId = 1 and Advertisement_CategoryDetail_DefinitionId = 1)
and
exists (select AdvertisementId from Advertisement_CategoryDetail_Values where AdvertisementId = Advertisements.id  and Advertisement_CategoryDetailId = 2 and Advertisement_CategoryDetail_DefinitionId = 2)

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多