在MySQL中,组合查询以获取列名称和该列上的第二个查询

时间:2011-11-13 15:24:00

标签: mysql sql

我想使用字段名来确定我将用于搜索的列,但首先我必须使用该名称来查找列ID,然后将列ID与字符串连接以获取实际的列名。我现在正在处理两个查询,但我想将它们组合成一个查询。

例如,我想搜索“fool = true”。在第一个表中,我发现“傻瓜”的值在第二个表的第1列中。在第二个表格中,我执行 real 搜索,对于“field_id_1 = true”。

此表将名称映射到第二个表中使用的列ID。

exp_channel_fields
+field_id +field_name +
|---------|-----------|
|1        |fool       |
|2        |money      |
+---------+-----------|

此表包含我要搜索的数据,但列名与前一步的ID不完全匹配。我必须在我之前找到的ID前面添加“field_id_”:

exp_channel_data
+entry_id+field_id_1 +field_id_2 +
|--------|-----------|-----------|
|837     |true       |$500       |
|838     |false      |$50,000    |
+--------+-----------+-----------+

这是我使用的第一个查询,并将结果存储到$ myFieldID。

SELECT field_id as tField_id FROM exp_channel_fields 
WHERE field_name = 'fool'

然后我使用结果构建第二个查询:

SELECT
    GROUP_CONCAT(entry_id ORDER BY entry_id SEPARATOR '|')
    AS result_entries
FROM exp_channel_data
WHERE field_id_{$myFieldID} = "true"

有没有办法将这些组合成一个查询?提前谢谢!

2 个答案:

答案 0 :(得分:1)

不可能将查询结果用作列名,但您可以使用服务器端预处理语句来实现类似的行为。看看这个问题:

MySQL concat() to create column names to be used in a query?

答案 1 :(得分:0)

您的数据库未正确规范化。您应该将列拆分为行以进行此类查询:

exp_channel_fields
+field_id +field_name +
|---------|-----------|
|1        |fool       |
|2        |money      |
+---------+-----------|


exp_channel_data
+entry_id+field_id + value
|--------|-----------|-----------|
|837     |1          |true       |
|837     |2          |$500       |
|838     |1          |False      |
|838     |2          |$50,000    |
+--------+-----------+-----------+

然后查询非常简单:

SELECT field_id as tField_id FROM exp_channel_fields WHERE field_name ='傻瓜'

SELECT
    GROUP_CONCAT(entry_id ORDER BY entry_id SEPARATOR '|')
    AS result_entries
FROM 
   exp_channel_data inner join 
   exp_channel_fields 
     on exp_channel_data.field_id = exp_channel_data.field_id
WHERE value = "true"

也许你需要exp_channel_fields的表格和子表,因为不同的值类型。