Karmaşık MySQL Query

5 Cevap php

Ben televizyon programları hakkında bilgi tutan wordpress bir site kuruyorum. Ben her mesajı seçmek için özel alanları kullanarak ediyorum.

Tablo şöyle

+----+---------+----------+------------+
| id | post_id | meta_key | meta_value |
+----+---------+----------+------------+
| 1  |    1    |   name   | Smallville |
| 2  |    1    |  season  |     1      |
| 3  |    1    |  episode |     1      |
| 4  |    2    |   name   | Smallville |
| 5  |    2    |  season  |     1      |
| 6  |    2    |  episode |     2      |
+----+---------+----------+------------+

Temelde ne yapmam gerekiyor adı "Smallville" ile gösterir tv tümünü seçin ve atakları daha sonra sezon bunları sıralamak değildir. Ben oldukça basit olacağını düşündüm ama denedim her şey hiçbir döndürür.

Eğer ben bunu nasıl açıklayabilir misiniz?

5 Cevap

Sen böyle bir şey yapabilirsiniz:

SELECT 
    t1.post_id, 
    t1.meta_value AS name, 
    t2.meta_value AS season, 
    t3.meta_value AS episode
FROM
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'name'
    ) t1
INNER JOIN
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'season'
    ) t2 ON t1.post_id = t2.post_id
INNER JOIN
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'episode'
    ) t3 ON t1.post_id = t3.post_id

Bu size sonucu verecektir:

| post_id | name       | season | episode |
-------------------------------------------
|    1    | Smallville | 1      | 1       |
|    2    | Smallville | 1      | 2       |

Bu formda bunun herhangi bir işlem için çok daha kolaydır.

Ne ihtiyacınız eklemek için:

WHERE name = 'Smallville'
ORDER BY season, episode

Bir self-join kullanarak satırları birleştirmek, ve gitmek için iyi bir konum:

SELECT      *
FROM        yourtable name
INNER JOIN  yourtable season 
            on season.post_id = name.post_id
            and season.meta_key = 'season'
INNER JOIN  yourtable episode
            on episode.post_id = name.post_id
            and episode.meta_key = 'episode'
WHERE       name.meta_key = 'name'
            and name.meta_value = 'Smallville'
ORDER BY    season.meta_value, episode.meta_value

Daha genel bir durum: Bir daha normal ilişkisel DB biçimine biçime dönüştürme tür-:

SELECT (SELECT meta_value FROM data t1 WHERE t1.post_id = t0.post_id AND meta_key = "season") AS season,
   (SELECT meta_value FROM data t1 WHERE t1.post_id = t0.post_id AND meta_key = "episode") AS episode
FROM data t0 WHERE meta_key = "name" AND meta_value = "Smallville"

Için gerçek siz (o henüz sıralama yaparken atanmaz) Sezon / bölüm değerleri yeniden kuramıyor, bu yüzden ORDER BY yan tümcesi içine alt sorgu / kopyalamak yapıştırmak zorunda sıralama:

ORDER BY (SELECT ... "season") ASC, (SELECT ... "episode") ASC,

No need to do direct SQL. You've got access to the SQL query through the WP_Query object. Check out the filters surrounding the where clause in the WP_Query object (there is more than 1 way to get at it) and simply modify the default WP_Query parts before they're concatenated together.

Postmeta tuşu tarafından tüm mesajları alır WP_Query nesnesi kurarak başlayın postmeta değer, ve sonra bazı ekstra conditionals yapmak için nereye fıkrası biraz daha çakmak.

Eğer SQL sorgusu sipariş bölümünde almayı sağlar başka bir filtre var yani bunu değiştirebilirsiniz.

Sadece zaten sizin için inşa edilmiştir ne değiştirmek, burada yazma SQL el için hiçbir neden yok.

Fikir kendisine her biri belirli bir meta_key için satırları almak için 3 kez nerede tablo katılmak için:

SELECT t1.meta_value name, t2.meta_value season, t3.meta_value episode
FROM table t1
JOIN table t2 on t1.post_id = t2.post_id and t2.meta_key = 'season'
JOIN table t3 on t1.post_id = t3.post_id and t3.meta_key = 'episode'
WHERE t1.meta_key = 'name'
  AND t1.meta_value = 'Smallville'
ORDER BY t2.meta_value, t3.meta_value