简体   繁体   English

MySQL:我需要根据相同的条件从多个行中提取相同的列名称到单个查询中

[英]MySQL: i need to pull the same column name from multiple rows into single query based on same conditions

I want to combine the following queries into a single query: 我想将以下查询合并为一个查询:

SELECT val FROM resource WHERE facet="all" and urlId="1234"
SELECT val FROM resource WHERE facet="your" and urlId="1234"
SELECT val FROM resource WHERE facet="base" and urlId="1234"

Oh -- there are multiple "facets" for each urlId. 哦,每个urlId都有多个“方面”。 But only one row per "facet". 但是每个“方面”仅一行。 This table was setup by somebody else. 该表是由其他人设置的。 We are migrating away. 我们正在迁移。 Obviously it would be better to have a column for each "facet" and a single row, but it's too late for that. 显然,最好为每个“方面”都有一列,并为一行,但这已经为时已晚。

I can do this with multiple queries, but would like to have a faster/better solution. 我可以对多个查询执行此操作,但是希望有一个更快/更好的解决方案。

<pre>
mysql> describe resource;
+-------------+-------------------------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                                | Null | Key | Default           | Extra                       |
+-------------+-------------------------------------+------+-----+-------------------+-----------------------------+
| resId       | int(11) unsigned                    | NO   | PRI | NULL              | auto_increment              |
| urlId       | int(11)                             | NO   | MUL | NULL              |                             |
| sectionId   | int(3)                              | YES  |     | NULL              |                             |
| mode        | enum('archive','live','edit','dev') | NO   |     | edit              |                             |
| facet       | varchar(50)                         | NO   | MUL | NULL              |                             |
| typeId      | int(1)                              | NO   |     | 1                 |                             |
| val         | mediumtext                          | NO   |     | NULL              |                             |
| itemOrder   | tinyint(2)                          | NO   |     | 1                 |                             |
| editorId    | varchar(30)                         | NO   |     | NULL              |                             |
| created     | datetime                            | NO   |     | NULL              |                             |
| lastUpdated | timestamp                           | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+-------------------------------------+------+-----+-------------------+-----------------------------+
11 rows in set (0.05 sec)
</pre>

Remember: in soviet russia, SQL queries you. 请记住:在苏联,SQL查询您。

This is my preferred method which will use your indexes: 这是我首选的方法,它将使用您的索引:

SELECT resource.val FROM
  ( (SELECT "all" AS name) UNION (SELECT "your") UNION (SELECT "base") ) AS facets
  LEFT JOIN resource ON( resource.facet  = facets.name AND resource.urlId = "1234" )
SELECT val
FROM resource
WHERE urlId = '1234'
AND facet IN ('all', 'your', 'base');

You can use the mysql IN() comparison operator. 您可以使用mysql IN()比较运算符。

Eg: 例如:

SELECT `val` FROM `resource` WHERE `urlId` = "1234" AND `facet` IN("all", "your", "base");
SELECT val
FROM resource 
WHERE (facet = "all" or facet = "your" or facet = "base")
AND urlId = "1234"

or 要么

SELECT val
FROM resource 
WHERE facet in ("all", "your", "base")
AND urlId = "1234"
SELECT val
FROM resource
WHERE urlId = '1234'
AND facet IN (
  SELECT "all", "your", "base";
)

Result in three columns: 结果分为三列:

SELECT (SELECT val FROM resource WHERE facet="all" and urlId="1234"),
       (SELECT val FROM resource WHERE facet="your" and urlId="1234"),
       (SELECT val FROM resource WHERE facet="base" and urlId="1234")

But I personally don't recommend this, it's not scalable. 但我个人不建议这样做,因为它无法扩展。 Go with my other answer. 和我的其他答案一起去。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM