SQL MYSQL Mult-Table Query Join - PullRequest
       1

SQL MYSQL Mult-Table Query Join

1 голос
/ 09 февраля 2012

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

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

ТАКЖЕ ПРИМЕЧАНИЕ: я делаю это на PHP и мне все равно, сколько запросов или циклов Мне нужно сделать, чтобы выполнить это .. так что, если несколько запросов или цикл PHP может тогда помогите, пожалуйста, предложите это. Спасибо

ОБНОВЛЕНИЕ: Чтобы упростить это, если вы можете решить эту проблему с помощью металлов, таких как% White Gold%, таких как% catFilter.value%, я думаю, это будет проще.

Я могу использовать циклы PHP для выполнения остальных.

Спасибо всем, кто нашел время, чтобы посмотреть.

У меня есть 3 таблицы со следующими полями:

catFilter - (id, catTypeId, value)
products - (id, availMetals)
prodFilter - (id, catFilterId, productId)

И следующие отношения

products.id = prodFilter.productId
catFilter.id = prodFilter.catFilterId

Мне нужно получить три куска данных как конечный результат:

catFilter.id (also could be prodFilter.catFilterId)
catFilter.value

Пока что я могу получить эти два ... Мне нужен третий ..

A COUNT OF ..  All Products who have an availMetals like
of %White Gold% and also has catTypeId = 1

Вот как будет выглядеть окончательный список ...

catFilter.value - Количество продуктов

classic - 0
rings - 0
sets - 1
stones - 5
three - 0
halo - 3

и т.д .. и т.д ...

Вот некоторые примеры данных для таблиц

products

id - availMetals
111 - White Gold
112 - White Gold, Yellow Gold
113 - White Gold
114 - White Gold
115 - White Gold
116 - White Gold, Platinum, Palladium


prodFilter

productId - catFilterId
111 - 43
111 - 12
111 - 48
111 - 47
112 - 12
112 - 51
112 - 48
113 - 12
113 - 51
113 - 48
114 - 12
114 - 51
114 - 48
115 - 12
115 - 48
116 - 12
116 - 51

catFilter
id - catTypeId - value
1 - 1 - Classic
50 - 1 - Rings
47 - 1 - Sets
48 - 1 - Stones
49 - 1 - Three
51 - 1 - Halo

Ответы [ 4 ]

1 голос
/ 09 февраля 2012

Хорошо, давайте попробуем пошагово:

SELECT * FROM catFilter
LEFT JOIN prodFilter ON catFilter.id = prodFilter.catFilterId
LEFT JOIN products ON products.id = prodFilter.productId

Вышеуказанное на основе описанных вами отношений вернет все данные, которые существуют в таблицах, объединенных в одно отношение. Поскольку мы используем LEFT JOIN, мы также получим catFilters, которые не используются ни в одном продукте.

Теперь, чтобы добавить упомянутые вами условия, давайте добавим условие where:

WHERE availMetals LIKE '%White Gold%' AND catTypeId = 1

Теперь вы хотите, чтобы результаты агрегировались по значению CatFilter, поэтому давайте добавим условие группировки:

GROUP BY catFilter.value

А теперь давайте просто выберем необходимое количество / поля:

SELECT catFilter.id, catFilter.value, count(catFilter.id) FROM catFilter
LEFT JOIN prodFilter ON catFilter.id = prodFilter.catFilterId
LEFT JOIN products ON products.id = prodFilter.productId
WHERE availMetals LIKE '%White Gold%' AND catTypeId = 1
GROUP BY catFilter.value
1 голос
/ 09 февраля 2012

Я использовал LEFT JOIN вместо INNER JOIN, чтобы он возвращал ноль в счетчике, если он не существует в таблице products.Попробуйте это:

ВЫБЕРИТЕ a.ID, a. Value, COUNT (c. *) в качестве ProductCount FROM catFilter a LEFT JOIN prodFilter b ON a.catTypeID = b.catFilterID LEFT JOIN продуктыc ON b.productID = c.ID, ГДЕ c.availMetals, такие как CONCAT ('%', a. Value, '%') И a.catTypeId = 1 ГРУППА ПО a.ID

ОБНОВЛЕНИЕ 1

SELECT 
    c.`Value`,
    COUNT(*) as TotalCount
FROM Products a LEFT JOIN prodFIlter b on
        a.ID = b.ProductID
    LEFT JOIN catFilter c
        b.CatFilterID = c.ID
WHERE c.CatTypeID = 1 and 
      a.availmetals like CONCAT('%', 'White GOld','%')
GROUP BY c.`Value`
1 голос
/ 09 февраля 2012

Это делает трюк?

select cf.id, cf.value,
  sum(if(cf.catTypeId = 1 and p.availMetals like concat('%', cf.value, '%')
  = 1, 1, 0)) as FinalCount
from catFilter cf
join prodFilter pf on cf.id = pf.catFilterId
join products p on pf.productId = p.id
group by cf.id, cf.value

Edit:

По предоставленным данным ничего не должно совпадать, верно? Потому что p.availMetals like concat('%', cf.value, '%') всегда ложно. Давайте заставим это. Изменить эту запись:

prodFilter
productId | catFilterId
111       | 43

На этот:

catFilter
id | catTypeId | value
1  | 1         | Classic

И измените это:

catFilter
id | catTypeId | value
1  | 1         | Gold

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

Редактировать 2

Из приведенных данных не может быть 3 совпадений Halo:

products
id - availMetals
111 - White Gold
112 - White Gold, Yellow Gold <-- Will look here and won't match!
113 - White Gold <-- Will look here and won't match!
114 - White Gold <-- Will look here and won't match!
115 - White Gold
116 - White Gold, Platinum, Palladium <-- Will look here and won't match!

Не говоря уже о том, что выбранный ответ не даст classic - 0 ни группе с 0 результатами.

1 голос
/ 09 февраля 2012

Попробуйте что-то вроде:

SELECT cf.id, cf.value, COUNT(p.id)
FROM catFilter cf
INNER JOIN prodFilter pf ON pf.catFilterId = cf.id
INNER JOIN products p ON p.id = productId
WHERE cf.catTypeId = 1 AND p.availMetals LIKE CONCAT('%', cf.value, '%')
GROUP BY cf.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...