2015-06-01 3 views
-1

Я хочу объединить все соответствующие данные запятой отдельно от подзапроса с помощью функции IN(). Но этот запрос возвращает только одно сообщение через объединение, и если я передаю статический идентификатор, например IN(1,2,3), тогда верните все данные, соответствующие ID.Как объединить несколько строк результатов подзапроса в mysql?

Пример:

(SELECT GROUP_CONCAT(product_name SEPARATOR ", ") AS pname FROM tbl_product WHERE product_id IN (b.product_id)) as product 

Возвращает одну запись:

(SELECT GROUP_CONCAT(product_name SEPARATOR ", ") AS pname FROM tbl_product WHERE product_id IN (1,2,3)) as product 

Возвращает 3 записи:

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

Это мой запрос:

$this->db->select('b.*, st.description as skin_tone, sp.description as skin_profile, sc.description as skin_concerns, pua.product, pua.producttype, pua.category, ua.description as action, t.description as type, 
    (SELECT GROUP_CONCAT(product_name SEPARATOR ", ") AS pname FROM tbl_product WHERE product_id IN (b.product_id)) as product', false); 

$this->db->from('tbl_basket b'); 
$this->db->join('tbl_skin_tone st', 'st.id = b.skin_tone_id', 'LEFT'); 
$this->db->join('tbl_skin_profile sp', 'sp.id = b.skin_profile_id', 'LEFT'); 
$this->db->join('tbl_skin_concerns sc', 'sc.id = b.skin_concern_id', 'LEFT');  
$this->db->join('tbl_product_updated_all pua', 'pua.id = b.product_id', 'LEFT'); 
$this->db->join('tbl_user_action ua', 'ua.id = b.action_id', 'LEFT'); 
$this->db->join('tbl_type t', 't.id = b.type_id', 'LEFT'); 
$this->db->where('b.customer_id', $reminderProductID); 

$query = $this->db->get(); 

return $query->result_array(); 

Пожалуйста, дайте мне знать, где я делаю неправильно.

+1

Какой язык программирования/рамки это? Добавьте соответствующие теги. –

+0

Я использую codeigniter framework для PHP. –

+0

Я не понимаю, о чем вы спрашиваете (хотя, кажется, GL). Если вам нравится, подумайте о следующем простом двухэтапном курсе действий: 1. Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

ответ

1

Это выражение:

SELECT GROUP_CONCAT(product_name SEPARATOR ", ") AS pname 
FROM tbl_product 
WHERE product_id IN (b.product_id)) as product 

Не делать то, что вы ожидаете. Когда product_id является строкой, например '1,2,3', то это один элемент в списке, а не три.

Правильное решение вашей проблемы состоит в том, чтобы НЕ хранить списки в виде списков, разделенных запятой. SQL имеет отличную структуру данных для хранения списков; это называется «таблицей», а не «строкой». Кроме того, хранение чисел в виде строк - очень плохая идея.

Существует обход, в то время как вы выясняете правильную структуру данных. То есть функция find_in_set():

WHERE find_in_set(product_id, b.product_id) as product 
+0

Большое вам спасибо ** Гордон Линофф ** find_in_set() работает нормально. –

Смежные вопросы