我有两张桌子。
首先是文章:
ID | title
和价值观:
1 | title1 | content 1
2 | title2 | content 2
3 | title 3 | content 3
和第二个属性:
artID | attrib | value
和价值观:
1 | date | 2014-06-15
1 | visible | true
1 | featured | false
2 | date | 2010-03-02
2 | visible | fals
2 | featured | true
3 | date | 2012-04-02
3 | visible | true
3 | featured | true
(我试着逐行显示它们,但编辑在这里疯了)。
artID是第一张表的ID。
我试着得到这样的结果:
ID | title | date value | featured value | only WHERE visible = "true"
我的尝试:
SELECT articles.ID, articles.title, attributes.artID, attributes.attrib, attributes.value
FROM articles
INNER JOIN attributes
ON articles.ID = attributes.artID
WHERE attributes.attrib=visible AND attributes.value=true
所以现在我有:
ID | title | (attributes.artID) | (attributes.fieldID) | (attributes.value) | only WHERE visible = "true"
(我在最终数组中不需要括号中的字段)
问题是:
如何在同一查询中获取“日期”和“特色”值(或其他方式?)
答案 0 :(得分:0)
我遗漏了att1.artID,它是重复的。
SELECT articles.ID, articles.title, att1.attrib, att1.value, att2.date, att2.featured
FROM articles
INNER JOIN attributes AS att1
ON articles.ID = att1.artID
LEFT JOIN attributes AS att2
ON articles.ID = att2.artID
WHERE att1.attrib=visible AND att1.value=true
答案 1 :(得分:0)
Select * from articles where articles.ID IN (Select artID from attributes where attrib='visible' and value='true')
MySQL中的IN子句允许您指定ID列表。假设ID 1,2,3可见。这相当于说
Select * from articles where ID='1' OR ID='2' OR ID='3'
但它会动态生成列表。你的连接不起作用的原因是因为它不会附加连接中的所有属性,而是会选择最后一个属性并追加它,所以你会得到类似的东西:
ID | Title | Attrib | Value
不
ID | Title | Date | Visible | Etc
您需要更改选择部分以适合您想要选择的内容,但使用IN关键字获取可见记录是一种快速简便的解决方案。
答案 2 :(得分:0)
试试:
select id , date , featured, visible from (
SELECT articles.ID, max(case when attrib = 'date' then value end) as 'date'
,max(case when attrib = 'featured' then value end) as 'featured' ,
max(case when attrib = 'visible' then value end) as 'visible'
FROM articles
INNER JOIN attributes
ON articles.ID = attributes.artID
GROUP BY articles.ID
)t
WHERE t.visible ='true'
答案 3 :(得分:0)
您可以通过为3个属性加入属性表3时间来实现此目的 {{3H2>