MySQL - 在单个列中查询多个值

时间:2012-09-23 13:44:22

标签: php mysql wordpress

我目前正在使用Wordpress的WP-Property插件开发网站。

基本上我试图在特定价格范围的文本搜索链接旁边显示一个计数器。

以下是我正在运行的查询,价格范围计算完全正常。

  $apartprice1 = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->postmeta WHERE meta_value BETWEEN 50000 AND 74999");
if (0 < $apartprice1) $apartprice1 = number_format($apartprice1);

然而,我想延伸到这一点,只显示在这个特定价格范围内的“公寓”。 现在请记住,在meta_value列中,还会存储属性类型值(公寓,房屋,永久产权)。

任何关于谁可以为我揭开神秘面纱的棺材?

编辑:下面进一步阐述:

Table name is postmeta

meta_id     post_id     meta_key        meta_value

348         41          property_type   apartment
358         41          price           698000

所以我希望能够计算一个特定的价格范围,这也是基于特定的房产类型

2 个答案:

答案 0 :(得分:0)

如果您要显示partmentshousesfreeholds每个属性值的计数,则应添加GROUP BY property_type

SELECT  property_type, COUNT(*) 
FROM $wpdb->postmeta 
WHERE meta_value BETWEEN 50000 AND 74999
GROUP BY property_type

更新:您必须行划分为列,以便按照您所描述的方式获取数据:

SELECT t.property_type, COUNT(t.post_id) AS 'type count'
FROM
(
   SELECT t.post_id,
     MAX(CASE WHEN t.meta_key = 'property_type' THEN t.meta_value END) AS property_type,
     MAX(CASE WHEN t.meta_key = 'price' THEN CAST(t.meta_value AS DECIMAL) END) AS Price
   FROM postmeta t
   GROUP BY t.post_id
) t
WHERE t.property_type = 'apartment' 
  AND t.Price BETWEEN 600000 AND 700000
GROUP BY t.property_type

请注意,meta_value字段应该存储属性类型的字符串值以及price的数值,因此我CAST将其DECIMAL添加到MAX为了将其选择为数字数据类型,以便稍后可以对其进行计算。我还使用{{1}}作为聚合函数来解决行数。

这是demo in SQL fiddle

这是你在这种设计模型中经常遇到的,他们称之为Entity–attribute–value model。您可以在标记下找到有关此数据模型的大量有用主题。您还可以在the following answer

中找到有关此设计模型的更多有用网页

答案 1 :(得分:0)

这种表结构使得您正在寻找的多面搜索类型变得有些困难/低效。为确保满足所有WHERE条款,您需要INNER JOIN meta个表格。这为您提供了更适合您的查询的临时数据格式。

SELECT m1.post_id
FROM meta m1
INNER JOIN meta m2 ON m1.post_id = m2.post_id
WHERE m1.meta_key = 'price'
AND m1.meta_value
BETWEEN 50000 AND 7000000 AND m2.meta_key = 'property_type'
AND m2.meta_value = 'apartment'

请注意,对于您添加的每个其他方面,您都需要额外执行INNER JOIN。另外,如果您还没有,我建议在post_id列上添加一个索引。

要获得计数,只需更改SELECT子句中的内容。

SELECT COUNT(*)
FROM meta m1
INNER JOIN meta m2 ON m1.post_id = m2.post_id
WHERE m1.meta_key = 'price'
AND m1.meta_value
BETWEEN 50000 AND 7000000 AND m2.meta_key = 'property_type'
AND m2.meta_value = 'apartment'