MySQL属性数据库

MySQL属性数据库,sql,mysql,join,normalization,Sql,Mysql,Join,Normalization,我有一个属性数据库。每个属性值都存储在一个表中,表的父属性具有一个ID SELECT upa1.value, upa2.value, up1.status, u1.status FROM product p /* These joins get attribute/value for 'username' attribute */ INNER JOIN product_attribute pa1 ON p.product_id = pa1.product_id

我有一个属性数据库。每个属性值都存储在一个表中,表的父属性具有一个ID

SELECT upa1.value, upa2.value, up1.status, u1.status 
  FROM product p
    /* These joins get attribute/value for 'username' attribute */
    INNER JOIN product_attribute pa1
      ON p.product_id = pa1.product_id
        AND pa1.attribute_name = 'username'
    INNER JOIN user_product_attribute upa1
      ON pa1.product_attribute_id = upa1.product_attribute_id
    INNER JOIN user_product up1
      ON upa1.user_product_id = up1.user_product_id
    INNER JOIN user u1
      ON up1.user_id = u1.user_id 
    /* These joins get attribute/value for 'domain' attribute */  
    INNER JOIN user_product_attribute upa2 
      ON upa1.user_product_id = upa2.user_product_id
    INNER JOIN product_attribute pa2
      ON upa2.product_attribute_id = pa2.product_attribute_id            
        AND pa2.attribute_name = 'domain'
  WHERE p.product_name = 'email'
在一个独立的表中,我将编写一条SQL语句来提取数据

WHERE username = '' AND domain = ''  
在属性表中,由于每个值都存储为单独的行,因此我无法执行此操作。。我有一个连接,允许我带回一个值+结果(见下文),但我需要一个基于上述两个标准的结果

SELECT upa.value, up.status, u.status
  FROM user_product up, product_attribute pa, product p, user u, user_product_attribute upa

 WHERE pa.attribute_name = 'username'
   AND pa.product_attribute_id = upa.product_attribute_id
   AND pa.product_id = p.product_id
   AND u.user_id = up.user_id
   AND up.user_product_id = upa.user_product_id

   AND p.product_name = 'email'
   AND upa.value      = 'exampleuser'
我想我需要再次加入上面提到的能人的某种联盟?任何输入都会有帮助


谢谢

请不要使用隐式连接语法。需要第二组联接来获取第二个属性

SELECT upa1.value, upa2.value, up1.status, u1.status 
  FROM product p
    /* These joins get attribute/value for 'username' attribute */
    INNER JOIN product_attribute pa1
      ON p.product_id = pa1.product_id
        AND pa1.attribute_name = 'username'
    INNER JOIN user_product_attribute upa1
      ON pa1.product_attribute_id = upa1.product_attribute_id
    INNER JOIN user_product up1
      ON upa1.user_product_id = up1.user_product_id
    INNER JOIN user u1
      ON up1.user_id = u1.user_id 
    /* These joins get attribute/value for 'domain' attribute */  
    INNER JOIN user_product_attribute upa2 
      ON upa1.user_product_id = upa2.user_product_id
    INNER JOIN product_attribute pa2
      ON upa2.product_attribute_id = pa2.product_attribute_id            
        AND pa2.attribute_name = 'domain'
  WHERE p.product_name = 'email'

需要将所有连接重复两次才能获得这两个属性。这并不完美,尤其是当您一次需要超过2或3个属性时

SELECT upa.value, up.status, u.status
FROM user_product up
JOIN user u    ON u.user_id = up.user_id

-- Join to get attribute 'username'
JOIN user_product_attribute upa1 ON up.user_product_id = upa1.user_product_id
JOIN product_attribute pa1 ON pa1.product_attribute_id = upa1.product_attribute_id
JOIN product p1                  ON pa1.product_id = p1.product_id

-- Join to get attribute 'domain'    
JOIN user_product_attribute upa2 ON up.user_product_id = upa2.user_product_id
JOIN product_attribute pa2 ON pa2.product_attribute_id = upa2.product_attribute_id
JOIN product p2                  ON pa2.product_id = p2.product_id

WHERE pa1.attribute_name = 'domain'
  AND p1.product_name = 'email'
  AND upa1.value      = 'exampledomain.com'

  AND pa2.attribute_name = 'username'
  AND p2.product_name = 'email'
  AND upa2.value      = 'exampleuser'
;

Product
对于两组属性都是通用的(
Product.Product\u name='email'
),因此该表在查询中只能引用一次。您好,谢谢您的输入。。然而,我看到的问题是,可能有很多领域,而不仅仅是一个。。因此,这样的连接将返回1:*而不是1:1..@Lee,在这种情况下,您需要使用选择记录所需的逻辑更新您的问题。例如,是否要搜索任何关联域记录匹配的记录或某些其他逻辑?值通过用户产品属性表中的用户产品标识链接到用户产品。。所以域+用户名组合应该共享相同的用户\产品\ id值。嗨,谢谢你的输入。。然而,我看到的问题是,可能有很多领域,而不仅仅是一个。。因此,这样的连接将返回1:*而不是1:1。如果给定产品有多个域,您如何决定要返回哪个域?换句话说,你会用什么其他标准来打破多个域之间的联系?@Lee:根据你对@ar的评论更新了我的答案,关于常见的
user\u product\u id
值。谢谢你,我做了一件好事。。我也能看出我的想法有误。