PHP ile Postgres yerden etkili bir soru için birçok etiket olsun

2 Cevap php

How can you get many tags for a question effectively from Postgres database PHP ile?

I tablolar tags ve questions I örneği için sırasıyla değişkenleri questions_question_id ve question_id, sahip olduğu.

One question may have many tags. I can select question_id, title and a tag from the tables. However, I do not know how to get many tags for one question out of the database effectively. PHP restricts me in manipulating the data as matrices.

I can read question_id, title and tag to the variable $result. The data is a matrix for me in the variale $result. However, I cannot refer to the data like to a matrix.

Ben sadece buldum fonksiyonları pg_fetch_row ve pg_fetch_all_columns PHP var. Sütunlar için diziler ikincisi ise eski, satırlar için diziler verileri alır.

LEFT JOIN ile benim sorunum aşağıdaki gibi verileri elde etmek mümkün olmayabilir beni düşündürmektedir

  1. * Başlık, question_id * ve tag için sütunları olsun
  2. grup, benim sorulara etiketleri koyabilirsiniz question_id tarafından veriler: PHP ile veri işlemek için çalıştık, ama ben sadece almak this far.

2 Cevap

Ben ne istiyorum, belirli bir soru için tüm etiketleri alır ikinci bir sorgu olduğunu düşünüyorum. Onları bir araya çalışılıyor olacak hantal olacak. Bu yapılabilir ama aynı soru verilerin ancak farklı etiket veri ile birkaç satır ile bitireceğiz.

Yani ilk önce bu gibi bir şey (yani, bu sadece bir örnek sizin veritabanı yapısını bilmiyorum) yapın:

SELECT * FROM QUESTIONS WHERE ID = <id>;

O zaman doğru tüm etiketler için sorar biri, sonra bir sorgu yapmak:

SELECT * FROM TAGS WHERE QUESTION_ID = <question_id>;

Eğer cesur iseniz, sizin için birlikte tüm alakalı etiketler birleştirir PostgreSQL bir toplama işlevi uygulamak ve daha sonra tek bir sorgu olacak Do What You Want (tm).

pg=> create aggregate ARRAY_ACCUM (
  sfunc = array_append,
  basetype = anyelement,
  stype = anyarray,
  initcond = '{}'
);

pg=> select QUESTIONS.ID as "QID",
pg-> array_to_string(array_accum(TAG), ',') as "TAGS"
pg-> from QUESTIONS
pg->   left join TAGS on QUESTIONS.ID = TAGS.QID;
 QID |     TAGS      
-----+---------------
   1 | foo, bar, baz
   2 | foo, bar
   3 | foo
   4 | 

-- Reference, for completeness --
pg=> select * from QUESTIONS;
 id 
----
  1
  2
  3
  4
(4 rows)

pg=> select * from TAGS;
 qid | tag 
-----+-----
   1 | foo
   1 | bar
   1 | baz
   2 | foo
   2 | bar
   3 | foo

MySQL altında, bu işlevi denir GROUP_CONCAT. Pg altında, "Do It Yourself" deniyor. :) Şimdi de, pg altında bu konuda gitmek için bile ustaca yolu vardır. Bu clever blog post check out, ve ben ^ Wadapted çaldım hangi yorumların, create aggregate çözüm yukarıda önerilen. :)