【问题标题】:How to SELECT over two tables?如何选择两个表?
【发布时间】:2012-03-07 08:33:43
【问题描述】:

在花了相当多的时间尝试和研究一些研究之后,我终于投降并请求你们的帮助。这是我的 MySQL 表的样子:

表1:

父ID |身份证 |姓名 |品质 |价格 1 | 001|苹果|好|1.50 1 | 002|苹果|中 |1.20 1 | 003|苹果|差 |0.99 2 | 004|汽车 |好|5000.00 2 | 005|汽车 |可怜的|200.00

表2:

父ID |变量名 |价值 1 |颜色 |红色的 1 |尺寸 |大的 1 |评级 | 3 星 2 |颜色 |蓝色 2 |尺寸 |中等的 2 |评级 |好的

好的。到目前为止一切顺利。我现在需要的是一个查询,它给了我这个:

父ID |身份证 |姓名 |质量 |价格 |颜色 |尺寸 |评分 1 | 001 |苹果 |好 | 1.50 |红色 |大| 3星 1 | 002 |苹果 |中 | 1.20 |红色 |大| 3星 1 | 003 |苹果 |穷人| 0.99 |红色 |大| 3星 2 | 004 |汽车 |好 | 5000.00 |蓝色 |中 |好的 2 | 005 |汽车 |穷人| 200.00 |蓝色 |中 |好的

【问题讨论】:

  • 根据您的预期数据,我假设Table1 中的ID 列未用作键?
  • SELECT table1.parentID, if(table2.varname='color',table2.value, NULL) as 'color' FROM table1,table2 WHERE table1.ID = table2.ID
  • 加入两个都有parent_id 列的表让我感到恶心。

标签: mysql sql


【解决方案1】:

在 JOIN 子句中只需加入 table2 三次过滤 var_name。

SELECT t.parent_id, 
       t.id, 
       t.name, 
       t.quality, 
       t.price, 
       c.VALUE AS color, 
       s.VALUE AS size, 
       r.VALUE AS rating 
FROM   table1 t 
       LEFT JOIN table2 c 
         ON t.parent_id = c.parent_id 
            AND c.var_name = 'color' 
       LEFT JOIN table2 s 
         ON t.parent_id = s.parent_id 
            AND s.var_name = 'size' 
       LEFT JOIN table2 r 
         ON t.parent_id = r.parent_id 
            AND r.var_name = 'rating' 

【讨论】:

  • 就是这样!谢谢 - 你让我过得愉快(至少我早上 :-)
【解决方案2】:
Select T1.Parent_ID, T1.ID, T1.Name, T1.Quality, T1.Price,
    (select value from Table2 T2 where T2.Parent_ID = T1.Parent_ID and Var_Name = 'color') as color,
    (select value from Table2 T2 where T2.Parent_ID = T1.Parent_ID and Var_Name = 'size') as size, 
    (select value from Table2 T2 where T2.Parent_ID = T1.Parent_ID and Var_Name = 'rating') as rating
FROM Table1 T1

【讨论】:

  • 看起来它有效,但它是一个垃圾解决方案 - 即使是中等大小的表,这也会表现得非常糟糕 - 你每行执行 3 次查询!请参阅康拉德的回答,了解应该如何完成。
【解决方案3】:

还有另一种方法可以做到这一点。它只使用一个连接,但您必须使用聚合函数。

SELECT table1.*, 
max(if(table2.var_name='color',table2.value, NULL)) as color,
max(if(table2.var_name='size',table2.value, NULL)) as size,
max(if(table2.var_name='rating',table2.value, NULL)) as rating,
FROM table1 join table2 
WHERE table1.ID = table2.ID
GROUP BY table.*

【讨论】:

    【解决方案4】:

    我相信你只需要一个简单的加入......

    SELECT *
    FROM Table1 t1
    JOIN Table2 t2
      ON t1.Parent_Id = t2.Parent_Id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多