PHP / MySQL - *-çok İlişkiler

3 Cevap php

Yani, ilişkiler mysql nasıl çalıştığını anlıyorum ama ben onun benim kod uygulanan nasıl bulmaktan zor bir zaman yaşıyorum.

Örneğin, ben 3 tablolar söylüyorlar.

Tablo 1: Kullanıcıların - kullanıcı kimliği, kullanıcı adı, kullanıcı şehir

Tablo 2: kategoriler - kategori id, kategori adı

Tablo 3: user_categories - kullanıcı kimliği, kategori id

Belirli bir şehirde olan her kullanıcı için veritabanını sorgulamak ve onlar ... Bunu nasıl yapacağını ait kategoriler tüm bunları listelemek olsaydı? Ben sonuçları döngü gerekir ve her kullanıcı için ayrı bir sorgu, sonra sonuçları listesi mi? Ya da, çok boyutlu bir dizi dönecektir bazı sihirli sorgu var?

Ben yanılıyorsam yukarıdaki, beni çok-çok düzeltmek olacağına inanıyorum ....

EDIT user_categories tabloda, bir kullanıcı birden fazla 1 kategori içerebilir, ben hepsini geri dönmek için nasıl anlamaya çalışıyorum

Teşekkürler!

3 Cevap

You're absolutely right, it is a many-to-many query. And from what I understand, what you're looking for is the ability to have some kind of hierarchical result to display, meaning for one user, have an array of all the categories he's assigned to...

Couple of things you could do: Option 1: Query the users table:

SELECT u.user_id, u.username, u.user_city WHERE city = 'somecity';

Sonuçlardan, tüm USER_ID adlı bu maç olsun, onları bir dizi koymak.

array(1,3,4,5)

Sonra 2 tabloları kategoriler ve user_categories katılarak, ve bir yerde bir virgülle ayrılmış bir liste olarak dizisi geçirerek bir sorgu çalıştırmak:

SELECT user_categories.user_id, categories.category_name
FROM user_categories INNER JOIN categories ON user_categories.category_id = categories.category_id
WHERE user_categories.user_id IN (1,3,4,5)

Bu size bir sonuç kümesi oluşturmak için önceki sonuçlar ile komut kullanabilirsiniz user-id, kategori adının bir listesini verecek

seçenek 2: Benim MySQL'in GROUP_CONCAT kullanın, tercih (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat).

SELECT users.user_id, users.user_name, GROUP_CONCAT(categories.category_name) AS categories
FROM users
INNER JOIN user_categories ON users.id = users_categories.user_id
INNER JOIN categories ON user_categories.category_id = category.id
WHERE user.user_city = 'somecity'
GROUP BY user.user_id

Bu gibi bir şey dönecektir:

user_id       username      categories
1             u1            cat1, cat2, cat3
2             u2            cat1, cat3

Siz group_concat ve ayırıcı kullanılarak ayırıcı belirtebilirsiniz.

Sen JOIN tabloları gerekir.

Belirli bir şehirde olan her kullanıcı için veritabanını sorgulamak ve kategoriler tüm bunları listelemek olsaydı onlar aittir

SELECT *
FROM users
INNER JOIN user_categories
  ON (user_id)
INNER JOIN categories
  ON (category_id)
WHERE ...

Eğer deneyebilirsiniz:

SELECT u.user_id, u.username, u.user_city, c.category_id, c.category_name
FROM users u 
INNER JOIN user_categories uc ON u.user_id = uc.user_id
INNER JOIN categories c ON uc.category_id = c.category_id
WHERE u.user_city = 'Cityname';

Ben bu test değil ve orada bunu yapmak için daha etkili bir yol olabilir, ama çalışması gerekir.

Eğer aşina değilseniz onay this, mysql dışarı katılır.