PHP / MySQL: SELECT deyim, birden NEREDE veritabanından doldurulur ait,

2 Cevap php

Ben nerede bir sürekli değişen sayısına göre doldurulması için bir deyim nasıl anlamaya çalışıyorum. Bu sipariş durumu izleme uygulaması içindir.

Temel olarak, fikri bir kullanıcı (bizim şirketin müşteri) günlükleri, ve, onun / onu siparişleri görmek durumunu kontrol, vb hiçbir sorun olabilir. Bu kullanıcı birden fazla şirket ile ilişkili gerektiğinde sorun ortaya çıkar. Onlar işe ya da kendi iki farklı şirketler veya birden çok alt şirketler, her biri ayrı ayrı sipariş sahibi bir şirket için çalışmak, ancak büyük-shot şirketlerin tüm göre sıralı her şeyi görmek gerektiğini söylüyorlar. Ben bir sorun haline çalıştırıyorum yerdir. Ben bu gerçekleşmesi yapma iyi bir şekilde anlamaya görünüyor olamaz. Ben ile geldi tek şey şudur:


client='Client Name One' OR client='Client name two' AND hidden='0' OR client='Client name three' AND hidden='0' OR client='Client name four' AND hidden='0'

(Böylece müşteri, daha önceki kod istemci kullanıcının şirket anlamına gelir unutmayın) />

veritabanının benim kullanıcıların tablodaki bir sütun denilen şirketin içine yerleştirilir. Bu daha sonra böyle çağrılır:


$clientnamequery = "SELECT company FROM mtc_users WHERE username='testing'";
$clientnameresult = mysql_query($clientnamequery);  list($clientname)=mysql_fetch_row($clientnameresult);

$query  = "SELECT -redacted lots of column names- FROM info WHERE hidden='0' AND $clientname ORDER BY $col $dir";
$result = mysql_query($query);

Bu gizli = '0 'doğru ben PHP = istemci eklemek yapmak gibi' ve 'olamaz çalışır VE olurken şeydir. Ayrıca, bu tür kıytırık bulunuyor.

Herhangi bir fikir? Şimdiden teşekkürler!

2 Cevap

Tim'in cevap genişletilmesi, size IN operator kullanabilir ve subqueries:

SELECT *columns* FROM info 
  WHERE hidden='0' AND client IN
  (   SELECT company FROM co_members 
        WHERE username=?
  )
  ORDER BY ...

Ya da bir deneyebilirsiniz join:

SELECT info.* FROM info 
  JOIN co_members ON info.client = co_members.company
  WHERE co_members.username=?
    AND hidden='0'
  ORDER BY ...

Bir birleştirme tercih edilen yaklaşımdır. Durumunda daha sonra tablo tanımını değiştirebilirsiniz (Eğer EXPLAIN SELECT ... ). You probably shouldn't grab all table columns (the info.* ile test olmalıdır rağmen) diğer nedenleri arasında, muhtemelen en verimli olacak; İstediğin hangi sütunları bilmiyordum çünkü ben sadece o koydu.

Alakasız bir not, ya mysqli veya PDO sürücüleri ile hazırlanmış sorguları kullanarak içine bakmak. Bir sorgu birden çok kez çalıştırmak ve aynı zamanda kullanıcı girdileri için ihtiyacı ortadan kaldıracak zaman hazırlıklı sorguları daha verimlidir.

Ilişkisel yaklaşım gibi tabloları içerir:

CREATE TABLE mtc_users (
    username PRIMARY KEY,
    -- ... other user info
) ENGINE=InnoDB;

CREATE TABLE companies (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR() NOT NULL,
    -- ... other company info
) ENGINE=InnoDB;

CREATE TABLE co_members (
    username NOT NULL,
    company NOT NULL,
    FOREIGN KEY (`username`) REFERENCES mtc_users (`username`) 
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (`company`) REFERENCES companies (`id`) 
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    INDEX (`username`, `company`)
) ENGINE=InnoDB;

Şirket adları benzersiz olması için ise, bir birincil anahtar ziyade id alanı olarak bu kullanabilirsiniz. "Co_members" kötü bir isimdir, ancak "çalışanlar" ve "pay" oldukça doğru terimleri görünmüyordu. Eğer sisteme daha aşina olduğu gibi, daha uygun bir isim ile gelmek mümkün olacak.

Sen IN anahtar sözcüğünü kullanabilirsiniz

client IN('client1','client2',...)