MySQL IN возвращает только одну строку, а запрос JOIN возвращает желаемый результат? - PullRequest
0 голосов
/ 17 августа 2011

У меня есть 3 таблицы, структуры приведены ниже

table_incident

+-------+-------------+------------+-----------------------------------+
| id(PK)    | incident_display_id | account_id | customized_fields_id  |
+-------+-------------+------------+-----------------------------------+
| 47614     |      33             |        394 | 1285,1286,1287,1288   |
+-------+-------------+------------+-----------------------------------+

table_customized_fields_data

+------+------------+----------+-------------+--------------------+
| id   | account_id | field_id(FK) | incident_id(FK) | value      |
+------+------------+----------+-------------+--------------------+
| 1285 |        394 |       49     |   47614         | Nikon 5MP  |
| 1286 |        394 |       50     |   47614         | CDMA       |
| 1287 |        394 |       51     |   47614         | Yes        |
| 1288 |        394 |       84     |   47614         | 9317001007 |
+------+------------+----------+-------------+--------------------+

table_customized_fields

+----+------------+------------+---------------------+------+-------------+
| id | account_id | field_type | label               | name | field_lable |
+----+------------+------------+---------------------+------+-------------+
| 49 |        394 | text_field | Camera              |      |             |
| 50 |        394 | checkbox   | Cellphone           |      | CDMA, GSM   |
| 51 |        394 | radio      | Sunglasses          |      | Yes, No     |
| 52 |        394 | textarea   | Credit Card         |      | 5           |
| 83 |        394 | radio      | Cowboy Hat          |      | Yes,No      |
| 84 |        394 | text_field | Emergency Contact # |      |             |
+----+------------+------------+---------------------+------+-------------+

Теперь яхотите выбрать только те метки и в отношении значения этой метки, которые существуют в table_incident,

Я запустил ниже запроса

SELECT ti.id IncID,tcf.id labelID,tcfd.id dataID,tcf.label, tcfd.value
FROM  table_customized_fields_data tcfd  
INNER JOIN table_incident ti  ON (ti.id = tcfd.incident_id)
INNER JOIN table_customized_fields tcf ON (tcf.id = tcfd.field_id)
WHERE tcfd.id IN (ti.customized_fields_id)
AND ti.id=47614


+-------+---------+--------+--------+-----------+
| IncID | labelID | dataID | label  | value     |
+-------+---------+--------+--------+-----------+
| 47614 |      49 |   1285 | Camera | Nikon 5MP |
+-------+---------+--------+--------+-----------+

, но возвращается только одна строка, вы все расскажетемне, что я делаю неправильно, хотя каждый подзапрос работает идеально индивидуально.

Примечание: хотя этот запрос перезапускает нужные данные:

SELECT tcf.id AS labelID,tcf.label,tcfd.id AS dataID, tcfd.value
FROM table_customized_fields_data tcfd 
JOIN table_customized_fields tcf ON tcf.id=tcfd.field_id
JOIN table_incident ti ON ti.id=tcfd.incident_id
WHERE ti.id=47614

но я думаю, что должны быть некоторыеоптимизированный способ, пожалуйста, поделитесь своей идеей.

Спасибо

Ответы [ 2 ]

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

ti.customized_fields_id - это строка, а не массив. Это не соответствует, но вы получаете одну строку, потому что это левое соединение и это mysql.

То, что вы хотите, выглядит примерно так:

SELECT ti.id IncID,tcf.id labelID,tcfd.id dataID,tcf.label, tcfd.value
FROM  table_customized_fields_data tcfd  
INNER JOIN table_incident ti  ON ti.id = tcfd.incident_id 
    AND concat(',', customized_fields_id, ',') like concat('%,', tcfd.id, ',%')
INNER JOIN table_customized_fields tcf ON tcf.id = tcfd.field_id
WHERE ti.id=47614

, в котором указано tcfd.id в строке customized_fields_id, если разделены запятыми

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

Ваш второй запрос оптимизирован.Просто убедитесь, что у вас есть индекс на table_customized_fields_data.incident_id.

Также я думаю, что вы неправильно поняли, как работает IN , цитата из руководства:

expr IN (значение, ...)

Возвращает 1, если expr равно любому из значений в списке IN, в противном случае возвращает 0 ...

поэтому ваш

tcfd.id IN (ti.customized_fields_id)

эквивалентен:

tcfd.id = ti.customized_fields_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...