Sorgu dönen garip sonuçlarını birleştirmek

5 Cevap php

Ben şarkıların bir listesini görüntülemek ve ne şarkılar, bir kullanıcı tarafından favori olarak tıklanan göstermek için bu sorgu kullanın.

$query = mysql_query(
  sprintf("
    SELECT 
      s.*,
      UNIX_TIMESTAMP(`date`) AS `date`,
      f.userid as favoritehash
    FROM
      songs s
    LEFT JOIN
      favorites f
    ON 
      f.favorite = s.id
      AND f.userid = %s",
  $userhash)
);

id artist title duration vs vs: songs tablo olarak kurulum

id favorite userid: favorites tablo olarak kurulum

userid benzersiz bir kullanıcı başvurmak için bir çerez saklanan bir karma değerdir.

Sorgu çalışıyor ama nedense ben bir tarayıcıda bir favori olarak bir şarkı işaretle. Ve sonra şarkı ... iki kez gösterilecektir kez her zaman için favori işaretlenmiş ancak favori göstergesi <3 yine düzgün gösterecektir birden fazla kullanıcı simüle etmek için başka bir tarayıcıda favori olarak aynı şarkıyı işaretleyin.

Herhangi bir fikir?

Peki bu kimse herhangi bir fikirleri varsa, bu neden bilmek sprintf () ama meraklı removign üzerinde çalışmak lazım.

5 Cevap

Sen sprintf'i ve% s (string) kullanıyorsanız, ancak tırnak içinde çıkan dize değerini kuşatan değildir. Kullanıcı kimliği bir dize ise, o zaman başka türlü yerine% s% d kullanmak, tırnak içine gerekir. Eğer sprintf'i çıkardığınızda çalışıyor yana, bu sorun gözükmektedir.

Seni f.userid =% bunu düzeltmek gerekir s nereye Ve F.userid =% s değişiklik olmadığını düşünmek benzer bir sorunu vardı?.

i ON-fıkra yanlış olduğunu düşünüyorum.

Bunun yerine bu deneyin:

ON f.favorite = s.id
WHERE f.userid = %s

Ben önceki önerileri aslında bir INNER JOIN olarak hareket etmek neden LEFT JOIN yenilgi inanıyorum; f.userid bazen NULL olur ve NULL, her zaman false olarak karşılaştırır.

Ben favorites tablosunun içeriğine bakarak başlamak istiyorum. Ben senin şema anlamak, emin belirli bir kullanıcı sadece sevdiğiniz her şarkı olabilir emin olmak için favorites üzerinde favorite ve userid üzerinde benzersiz bir anahtar kurmak isteyebilirsiniz kez. Bu yinelenen satırları alma, ve dolayısıyla sonuçlarını yinelenen olabilir, olduğunu.

Kullandığınız beri ben tüm şarkıların bir listesini istiyorum varsayarak ve kullanıcıların sık kolayca ayırt olmasını istediğiniz ediyorum 'katılmak sol'. Böyle bir şey yani:

song1 details | date | null
song2 details | date | userhash  (favorite)
song3 details | date | null

Aşağıdaki deneyin:

SELECT s.*, UNIX_TIMESTAMP(`date`) AS `date`, f.userid as favoritehash
FROM
  songs s
LEFT JOIN
  (SELECT userid, favorite FROM favorites WHERE userid = %s) f
ON 
  f.favorite = s.id