Yanıtlar:
SQL geriye doğru, sağdan sola doğru değerlendirilir. Böylece, where cümlesi ayrıştırılır ve select cümlesinden önce değerlendirilir. Bu nedenle, u_name için kullanıcı_adı'nın takma adı henüz oluşmadı.
Aşağıdaki MySQL kılavuz sayfasına bakın: http://dev.mysql.com/doc/refman/5.0/en/select.html
"Bir select_expr, AS alias_name kullanılarak bir takma ad verilebilir. Diğer ad, ifadenin sütun adı olarak kullanılır ve GROUP BY, ORDER BY veya HAVING yan tümcelerinde kullanılabilir."
(...)
Bir WHERE yan tümcesinde bir sütun diğer adına atıfta bulunulmasına izin verilmez, çünkü sütun değeri WHERE yan tümcesi yürütüldüğünde henüz belirlenmemiş olabilir. Bkz. Bölüm B.5.4.4, "Sütun Diğer Adlarıyla İlgili Sorunlar".
select u_name as user_name from users where u_name = "john";
Bunu şöyle düşünün, where cümleniz önce hangi satırların (veya birleştirilmiş satırların) döndürülmesi gerektiğini belirlemek için değerlendirilir. Where cümlesi yürütüldüğünde, select cümlesi onun için çalışır.
Daha iyi bir şekilde ifade etmek için şunu hayal edin:
select distinct(u_name) as user_name from users where u_name = "john";
İkincisi olmadan ilk yarıyı referans alamazsınız. Her zaman önce nerede değerlendirilir, ardından select cümlesi.
Veritabanında gerçekte mevcut olmayan yeni bir alan oluşturmak için bir SELECT ifadesi kullandığınız ve aşağıdaki gibi bir sorgu gerçekleştirmeye çalışıyorsanız (en az bir eke sahip tüm düğümleri bulun) ve kullanmayı deneyin bu sonucun takma adı, aynı problemle karşılaşacaksınız:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
WHERE yan tümcesinde "Bilinmeyen sütun 'ek sayısı' hatası alırsınız.
Çözüm aslında oldukça basittir - sadece takma adı, diğer adı üreten ifadeyle değiştirin, örneğin:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;
Yine de döndürülen takma adı alacaksınız, ancak artık SQL bilinmeyen takma adla çalışmamalıdır.
(
Sorgunuzda (COUNT(*)
herhangi bir yerde kapatılmayan fazladan bir şey olduğuna inanıyorum .
Tanımladığınız madde, bunun için maddeyi kullanmak zorunda olduğunuz madde alias
tarafından hoş karşılanmazWHERE
HAVING
SELECT u_name AS user_name FROM users HAVING user_name = "john";
VEYA orijinal sütun adını doğrudan WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Alt sorgu veya herhangi bir hesaplama sonucunda kullanıcı tanımlı takma adla sonuç almanızla aynı şekilde HAVING
,WHERE
SELECT u_name AS user_name ,
(SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
FROM users WHERE u_name = "john" HAVING user_last_name ='smith'
Ya:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
veya:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
RDBMS koşulu satır içi görünüme itmeyi destekliyorsa, ikincisi öncekiyle aynı olmalıdır.
düzeltilmiş:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Doğru adla seçmenize gerek yok. Bir takma addan seçtiğiniz tabloyu verdiyseniz, bunu da kullanabilirsiniz.
Hayır yapamazsın. user_name, dönüş zamanına kadar mevcut değildir.
WHERE
Madde 1 ve 2'nin neden olduğu ve 3. satır tarafından çözülen bilinmeyen sütun :
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Yardımcı olabilir.
Yapabilirsin
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
İşe yarıyor.
ANCAK NE YAPTIĞINIZDAN EMİN OLUN!
Ancak, bazı durumlarda yardımcı olabilir
Sorgunuzdaki tablolarınıza takma ad verebilirsiniz (örneğin, "Kullanıcılardan u.kullanıcı adını SEÇİN u;"), referans verdiğiniz sütunların gerçek adlarını kullanmanız gerekir. AS yalnızca alanların nasıl döndürüleceğini etkiler.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Sadece bu sorunu yaşadım.
Veritabanındaki varlığın adında boşluk olmadığından emin olun.
örneğin, "kullanıcı_adı" yerine "kullanıcı_adı"
IN koşulunu veya OR koşulunu kullanarak görevinizi deneyin ve ayrıca bu sorgu spark-1.6.x üzerinde çalışıyor
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
veya
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Ben de aynı sorunu yaşadım, bunu faydalı buldum.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
$ user'ı tek tırnak içine '' koymayı unutmayın.