2012-06-30 3 views
1

У меня есть две таблицы изображений2 и image_dataMySQL Объединить запрос и игнорирующие дубликатами

enter image description here enter image description here

Поэтому цель состоит в том, чтобы иметь 1 таблицу для всех добавляемых изображений (изображений2), а затем image_data - назначить это изображение с различными параметрами.

Так, например, вот некоторые примерные данные:

enter image description here

Так image_id 10 имеет более чем одну строку, так как это изображение связано как с TN и CQ. И они также могут быть связаны с несколькими языками и слайдами, поэтому я бы добавил к второй строке и изменил slide_id или language_id .., если захотел добавить больше, чем добавить новую строку для него.

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

enter image description here

мне нужна помощь в написании запроса. Один я прямо сейчас:

SELECT images2.id, images2.filename, image_data.slide_id, image_data.language_id, 
image_data.type FROM images2 
LEFT JOIN image_data ON images2.id = image_data.image_id 

Пару вещей неправильно с этим запросом .. Он показывает дубликаты, потому что image_id 10 имеет два ряда.

enter image description here

Но мне нужно, что вторая строка изображения # 10, потому что мне нужно, чтобы увидеть, что это также связано с CQ, так что я могу проверить флажок, когда он всплывает.

Поэтому мне нужно создать запрос, чтобы показать ВСЕ уникальные изображения без дубликатов, со всеми его вариантами.

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

Спасибо.

+0

Что вы подразумеваете под «показать ВСЕ уникальные изображения без дубликатов, со всеми параметрами, которые у него есть», чтобы показать ожидаемый результат – Mark

+0

Я использую один запрос, чтобы показать все изображения и взять все варианты. поэтому, если мой запрос возвращает несколько строк одного и того же photo_id, моя фотогалерея покажет это изображение более одного раза. – Drew

+0

, но вы сказали, что мне нужно увидеть, что это также связано с CQ - так точно, что вы хотите? – Mark

ответ

2

Что вы можете сделать, это использовать GROUP_CONCAT(), чтобы включить значения в несколько строк в одну сцепленную строку. Ниже приведены идентификаторы slides и languages, а также их имена, чтобы лучше облегчить вашу форму.

SELECT 
    a.id, 
    a.filename, 
    GROUP_CONCAT(CONCAT(b.slide_id, '::', c.slide_name)) AS slides, 
    GROUP_CONCAT(CONCAT(b.language_id, '::', d.language_name)) AS languages, 
    GROUP_CONCAT(b.type) AS types, 
FROM 
    images a 
LEFT JOIN 
    image_data b ON a.id = b.image_id 
LEFT JOIN 
    slides c ON b.slide_id = c.id 
LEFT JOIN 
    languages d ON c.language_id = d.id 
GROUP BY 
    a.id 

Ваш результирующий набор для изображения 10 будет выглядеть примерно так:

id | image_filename | slides | languages | types 
------------------------------------------------------------------------- 
10 | p170sfhe...  | 5::slide5 | 1::language1 | TN,CQ 

В PHP только explode() строки на основе разделителей.

+0

, за исключением пространства в «TN, CQ», поскольку разделитель по умолчанию равен «,» без пробела, поэтому его единственный «TN, CQ» –

+0

Это будет работать отлично, спасибо вам большое – Drew

1

вы могли бы использовать GROUP_CONCAT, чтобы получить CSV полей:

SELECT 
    images2.id, 
    images2.filename, 
    GROUP_CONCAT(DISTINCT image_data.slide_id) AS slides, 
    GROUP_CONCAT(DISTINCT image_data.language_id) AS langs, 
    GROUP_CONCAT(DISTINCT image_data.type) AS types 
FROM images2 
LEFT JOIN image_data ON (images2.id = image_data.image_id) 
GROUP BY images2.id 
Смежные вопросы