Gerekli mysql yardımıyla derleme dizi

4 Cevap php

Bu beni rahatsız etti, ben başımı alamıyorum. Benim gidebileceğini denemek ve basitleştirmek için gıda benzetme kullanacak.

1000 footstuff 13 kategorilerin her birinden çeşitli almak istedi halktan. Bu seçimler daha sonra kendi adına karşı bir mysql veritabanında saklanır.

e.g.    billy   mary   etc.   etc.

milk....semi. .skimmed...

bread...white...brown....

cheese..edam.....edam....

fruit...apple...orange...

veg....potato...sprout...

meat....beef.....beef....

sweet..bonbons..liquorice..

fish...trout....salmon...

crisp....s&v....plain....

biscuit..hovis..rich tea..

wine.....red.....red.....

beer....stella..carlsburg..

carb....coke.....pepsi....

Bu 1000 biri sıfırdan onay kutularını aracılığıyla kendi seçimleri ile 13 yerde seçmek istendi.

Veritabanı arayarak ne diğerleri aynı çeşitleri seçilir?

Tüm isimlerini ve ne hepsi 13 çeşitleri için seçilen gösteren bir tablo ekran.

Bu mantıklı mı? Bu beni deli ediyor çünkü ben öyle umuyorum.

4 Cevap

Basit bir düzen var varsayarsak, o zaman böyle bir şey (ben kategoriden üç kendimi kısıtlamak gerekir) olurdu:

PersonId  What_Milk  What_Bread  What_Cheese
       1  Semi       Wheat       Swiss
       2  Skimmed    Rolls       French
       3  Soy        Brown       Smelly
       4  Low Fat    Wheat       Swiss

Eğer doğru anladıysam, senin sorunun bu olduğunu:

Kişi 4 onu yiyecek maddeleri 0 .. 3 seçmek için sorulduğunda, o sorgu bir maç olarak kişinin 1 verim gerektiği anlamına gelir "Ekmek" ve "Cheese" onay kutusunu, seçebilirsiniz. Değil mi?

SELECT
  PersonId,
  What_Milk,
  What_Bread,
  What_Cheese
FROM
  FoodPreference
WHERE
  PersonId != ?
  AND What_Milk   = IFNULL(NULLIF(?, ''), What_Milk)
  AND What_Bread  = IFNULL(NULLIF(?, ''), What_Bread)
  AND What_Cheese = IFNULL(NULLIF(?, ''), What_Cheese)

Soru işareti yer tutucuları olan nerede kutucuğu değerler daha sonra gidecek. (I've replaced the CASE WHEN constructs that used to be here with IFNULL/NULLIF, that has the same effect but is friendlier for PHP prepared statements.)

Bir onay kutusu (böylece bir şey için değer tespit) işaretli değilse, ilgili sütun kendisine karşılaştırılır. O değeri sonucunu etkilemek anlamına gelir. Diğer sütunlar eşleşirse, satır seçilecektir.

Bu da zero onay kutularını kullanıcı tarafından seçildiği takdirde, all satırlar döndürülür anlamına gelir. Bir kişi seçer fazla besin öğeleri, yakın maç olacak.

PHP, ben size mysqli_prepare() sorgu dizesinden hazırlanmış bir deyimi oluşturmak için kullanmak, ve mysqli_stmt_bind_param() soru işareti yer tutuculara gerçek değerleri bağlamak için tavsiye ederim. Yani doğrudan SQL dize bina çok daha güvenlidir. PHP documentation has a whole lot of info on mysqli, ona bir göz var.

kısmi cevap:

  • sıralama ve birleştirerek seçimleri doğrusal bir dizi oluşturmak
  • sonra karşılaştıran basit bir WHERE yan tümce olur

Kelimenin tam anlamıyla "yağsız | | yarı süt" böylece ilk gibi bazı alana dizeleri koyarak, bir hesaplama koşmak yapardı.

SELECT  
    PersonId,  
    milk,  
    bread,  
    cheese
FROM  FoodPreference
WHERE  PersonId != :chosen_person_id  
    AND $milk= CASE WHEN :isset($_POST["milk"]))> '' THEN :isset($_POST["milk"]))   ELSE milk END  
    AND $bread= CASE WHEN :isset($_POST["bread"]))> '' THEN :isset($_POST["bread"]))  ELSE bread END  
    AND $cheese= CASE WHEN :isset($_POST["cheese"]))> '' THEN :isset($_POST["cheese"])) ELSE cheese END

Ben doğru yolda mıyım?

Tamam, ben bir yanıt gönderdi ama Tomalak haklı mantıklı bir kusur işaret etti. Ben tekrar deneyeceğim:

On üç sütun olarak kategorilerini listeleyen bir alternatif aşağıdaki gibi bir tabloda on üç satır olarak bunları listelemek için:

CREATE TABLE FoodPreference (
  PersonID   INT NOT NULL REFERENCES People,
  FoodCat    VARCHAR(10) NOT NULL REFERENCES FoodCategories,
  FoodChoice VARCHAR(10) NOT NULL,
  PRIMARY KEY (PersonID, FoodCat)
);
INSERT INTO FoodPreference VALUES
  (123, 'bread', 'white'),
  (123, 'milk', 'skim'),
  (123, 'cheese', 'edam'), ...
  (321, 'bread', 'brown'),
  (321, 'milk', 'whole'),
  (321, 'cheese', 'edam'), ...

Sonra o kişi (p3) tüm diğer seçenekler için başka bir kişinin (P2) ve oradan aynı gıda seçimi ile bir satır seçilmiş kişi (p1) herhangi bir satır eşleşen, aşağıdaki gibi bir sorgu kullanabilirsiniz:

SELECT DISTINCT p3.*
FROM FoodPreference AS p1
  JOIN FoodPreference AS p2 
    ON (p1.FoodCat = p2.FoodCat AND p1.FoodChoice = p2.FoodChoice 
      AND p1.PersonID != p2.PersonID)
  JOIN FoodPreference AS p3 
    ON (p2.PersonID = p3.PersonID AND p2.FoodCat != p3.FoodCat)
WHERE p1.PersonID = {(int)$chosen_person_id}
  AND p1.FoodCat IN ('milk', 'bread', 'cheese');

Liste 'süt', 'ekmek', WHERE yan tümcesinde 'peynir' uygulamanızda $_POST değişkeni dayalı size PHP kodu oluşturmak için gereken şeydir. Bir onay kutusu işaretli ise, listedeki gıda kategori vardır.

<?php
$food_cat_array = array("'none'");
$legal_food_cats = array('milk'=>1, 'bread'=>1, 'cheese'=>1, ...);
foreach (array_intersect_key($_POST, $legal_food_cats) as $key => $checked) {
  if ($checked) {
    $food_cat_array[] = "'$key'"; 
  }
}
$in_predicate = join(',', $food_cat_array);