Hat bir alanda sonları ve düzeni Sayısına Göre

4 Cevap php

I mysql_real_escape_string, ben bu alanda satır sonlarının sayısını ve bu numarayı kullanarak kayıtları sipariş etmek istiyorum kullanıyor takıldıktan recipes, bir tablodaki bir alan var.

P.S. Malzemeler alanı olarak adlandırılır.

Herkese teşekkürler

4 Cevap

Bu bunu:

SELECT *, LENGTH(Ingredients) - LENGTH(REPLACE(Ingredients, '\n', '')) as Count
FROM Recipes
ORDER BY Count DESC

Linebreaks miktarını alıyorum yolu ancak, kesmek bir parçasıdır, ve ben daha iyi bir yolu olduğunu sanmıyorum. Ben performansı büyük bir sorun olup olmadığını linebreaks miktarını sahip bir sütunu tutmak öneriyoruz. Orta ölçekli veri setleri için, ama, ben yukarıda ince olması gerektiğini düşünüyorum.

Eğer yukarıda anlatıldığı gibi bir önbellek sütun olmasını istedim varsa, yapardın:

UPDATE
    Recipes
SET
    IngredientAmount = LENGTH(Ingredients) - LENGTH(REPLACE(Ingredients, '\n', ''))

Eğer yeni bir satır ekleme / güncelliyoruz zaman Bundan sonra, size (muhtemelen PHP ile) tutarları hesaplamak olabilir ve bu sütunda doldurun önce elden. Eğer bu tür bir şey içine iseniz ya, denemek triggers.

Ben burada çok varsayarak yaşıyorum, ama ben senin yazı okuyorum ne, sizin veritabanı yapısı biraz değişebilir ve bu sorunu çözmek ve daha ilginç kullanımlarla kadar dataset açmak hem de.

Eğer kendi tabloya maddeleri ayırmak ve malzemeler yemek tarifleri, veri işleme ile yaratıcı olmak çok daha kolay olacak ki ortaya endeksi bir bağlantı tablo kullanın. Bu, reçete başına maddeleri saymak tarifleri benzerlikler bulmak için, aynı zamanda veri daha normalize ve daha küçük olurdu vb maddeler, setleri içeren yemek tarifleri aramak için daha kolay olur. (Tüm maddeler tek bir global listesini depolamak vs her reçete için bir dizi depolama)

Eğer şimdi bir reçete için malzemeyi girmek için tek bir metin girişi alanını kullanarak ediyorsanız, çizgilerle o girdi break up ve veritabanına kaydederken bir madde olarak her satırı kullanmak gibi bir şey yapabilirdi. PHP'nin yerleşik levenshtein() veya hatalı yazılan madde isimleri ile anlaşma ve possbile gibi normalize olarak kendi el-damat kalmadan verileri tutmak için similar_text() fonksiyonları [kullanıcıları '] gibi bir şey kullanabilirsiniz veri girişi çok fazla.

Bu gibi almak, sadece bir öneridir.

Burada yetenekleri ve SQL niyet ötesinde biraz gidiyoruz. Sen dize tarama ve sayısını döndürmek için bir saklı yordam yazmak ve sonra sorguda bu kullanabilirsiniz.

Ancak, ben size, bu sorguyu yaptığınızda her satırın dizeleri arama önlemek böylece Malzemeler ekleme ne olursa olsun tasarımını tekrar gerektiğini düşünüyorum. Bir 'num_linebreaks' sütun eklemek, satır sonlarının sayısını hesaplamak ve Indgredients eklerken bu sütunu ayarlayın.

Eğer ekleme yapıyor uygulaması üzerinde hiçbir kontrolü yaptıysanız, o zaman bir tetikleyici dayalı num_linebreaks güncellemek için bir saklı yordam kullanabilirsiniz.

Bu teşekkür, php kodu gibi görünüyor var:

$check = explode("\r\n", $_POST['ingredients']); 
$lines = count($check);

Ingred_count önceki kayıtlar için tek bir adam baskın alan Malzemeler dayalı Peki nasıl ben tablodaki tüm bilgileri güncellemek olabilir?