MySQL: мне нужно вытащить одно и то же имя столбца из нескольких строк в один запрос, основанный на тех же условиях - PullRequest
2 голосов
/ 03 августа 2011

Я хочу объединить следующие запросы в один запрос:

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"

О - есть несколько «граней» для каждого URL. Но только один ряд на «грань». Эта таблица была настроена кем-то другим. Мы уезжаем. Очевидно, что было бы лучше иметь столбец для каждого «фасета» и отдельной строки, но для этого уже слишком поздно.

Я могу сделать это с несколькими запросами, но хотел бы иметь более быстрое / лучшее решение.

<code><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)

Помните: в советской России SQL запрашивает вас.

Ответы [ 6 ]

1 голос
/ 03 августа 2011

Это мой предпочтительный метод, который будет использовать ваши индексы:

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" )
0 голосов
/ 03 августа 2011

Результат в трех столбцах:

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")

Но я лично не рекомендую это, это не масштабируется.Иди с моим другим ответом.

0 голосов
/ 03 августа 2011
SELECT val
FROM resource
WHERE urlId = '1234'
AND facet IN (
  SELECT "all", "your", "base";
)
0 голосов
/ 03 августа 2011
SELECT val
FROM resource 
WHERE (facet = "all" or facet = "your" or facet = "base")
AND urlId = "1234"

или

SELECT val
FROM resource 
WHERE facet in ("all", "your", "base")
AND urlId = "1234"
0 голосов
/ 03 августа 2011

Вы можете использовать оператор сравнения mysql IN().

например:

SELECT `val` FROM `resource` WHERE `urlId` = "1234" AND `facet` IN("all", "your", "base");
0 голосов
/ 03 августа 2011
SELECT val
FROM resource
WHERE urlId = '1234'
AND facet IN ('all', 'your', 'base');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...