Boolesche Werte in MySQL

jomafi

Grünschnabel
Hallo,

ich habe folgendes Problem, bzw. ich finde keinen funktionierenden Weg.

Die Datenbank ist folgendermaßen aufgebaut:

--
-- Tabellenstruktur für Tabelle `products`
--

CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`service_a` int(1) NOT NULL,
`service_b` int(1) NOT NULL,
`service_c` int(1) NOT NULL,
`service_d` int(1) NOT NULL,
`service_e` int(1) NOT NULL,
`service_f` int(1) NOT NULL,
`service_g` int(1) NOT NULL,
`service_h` int(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


--
-- Tabellenstruktur für Tabelle `usettings`
--

CREATE TABLE IF NOT EXISTS `usettings` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`service_a1` int(1) NOT NULL DEFAULT '1',
`service_a2` int(1) NOT NULL DEFAULT '1',
`service_b1` int(1) NOT NULL DEFAULT '1',
`service_b2` int(1) NOT NULL DEFAULT '1',
`service_c1` int(1) NOT NULL DEFAULT '1',
`service_c2` int(1) NOT NULL DEFAULT '1',
`service_d1` int(1) NOT NULL DEFAULT '1',
`service_d2` int(1) NOT NULL DEFAULT '1',
`service_e1` int(1) NOT NULL DEFAULT '1',
`service_e2` int(1) NOT NULL DEFAULT '1',
`service_f1` int(1) NOT NULL DEFAULT '1',
`service_f2` int(1) NOT NULL DEFAULT '1',
`service_g1` int(1) NOT NULL DEFAULT '1',
`service_g2` int(1) NOT NULL DEFAULT '1',
`service_h1` int(1) NOT NULL DEFAULT '1',
`service_h2` int(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


ich möchte eine SQL-Abfrage machen, welche mir nur die Boolesche Werte (Standard sind die Bits vom usettings true) "zeilenweise" die mySQL Daten in Tabelle products anzeigt.
 
Zuletzt bearbeitet:
Was willst du genau angezeigt haben? Mach mal ein kleines Datenbeispiel, dann versteh ev auch ich alter DB-Bastler was du haben willst
 
Und was hat diese CNN-Seite mit deinen Tabellen zu tun?
Ich gebs auf - ich will ja eigentlich helfen, doch zum Rätsel raten habe ich keine Lust.
 
@yaslaw Bitte nicht ärgern, sonst werden aus einer Falte zwei?

ich weiß nicht wonach ich suchen soll, weil ich mein Problem nicht so einfach beschreiben kann

ich möchte mir gerne aus einer Datenbank alle Werte ausgeben lassen, deren Status 1 gesetzt wurde.
 
Zuletzt bearbeitet:
SQL:
SELECT * FROM table WHERE status=1
Aber ich seh bei deinen Tabellen kein Feld Status. Haben deine 2 Tabellen irgend ein Zusammenhang? Wenn ja, welchen?
 
Zuletzt bearbeitet von einem Moderator:
Danke das du auf meine Frage geantwortet hast

Meine SQL-Abfrage sieht so aus:

PHP:
       public function getProducts($uname)
      {
          global $db;         
		  $today = date("Y/n/j", time());
		  $current_month = date("n", $this->time);
		  $current_year = date("Y", $this->time);
		  $current_month_text = date("F Y", $this->time);
		  $total_days_of_current_month = date("t", $this->time);
		  
		  $order = "id DESC";
          $sql = "SELECT DISTINCT p.*, b.*, u.*, DATE_FORMAT(p.date, '%d.%m.%Y') as created," 
		  . "\n DATE_FORMAT(date_start,'".$this->short_date."') AS sdate," 
		  . "\n DATE_FORMAT(time_start,'%H:%i') AS stime," 
		  . "\n DATE_FORMAT(date_end,'".$this->short_date."') AS edate," 
		  . "\n DATE_FORMAT(time_end,'%H:%i') AS etime" 
		  . "\n FROM products AS p" 
		  . "\n LEFT JOIN payments AS b ON p.id = b.product_id"
		  . "\n LEFT JOIN usersettings AS u ON u.uid = '".$uname."'"
		  . "\n WHERE date_start BETWEEN  '$current_year/$current_month/01'"
		  . " \n AND '$current_year/$current_month/$total_days_of_current_month'"
		  . "\n AND p.approved= 'yes'"
		  . "\n AND p.active = '1'"
		  . "\n AND b.status = '1'"
		  . "\n AND u.budget_a = '1'"
		  . "\n AND u.budget_b = '1'"
		  . "\n AND u.budget_c = '1'"
		  . "\n AND u.budget_d = '1'"
		  . "\n AND u.budget_d = '1'"
		  . "\n AND u.budget_f = '1'"
		  . "\n AND u.budget_g = '1'"
		  . "\n AND u.budget_h = '1'"
		  . "\n AND u.gebiet_a = '1'"
		  . "\n AND u.gebiet_b = '1'"
		  . "\n AND u.gebiet_c = '1'"
		  . "\n AND u.gebiet_d = '1'"
		  . "\n AND u.gebiet_e = '1'"
		  . "\n AND u.gebiet_f = '1'"
		  . "\n AND u.gebiet_g = '1'"
		  . "\n AND u.gebiet_h = '1'"
		  . "\n AND u.gebiet_i = '1'"
		  . "\n AND u.gebiet_j = '1'"
		  . "\n AND u.gebiet_k = '1'"
		  . "\n AND u.gebiet_l = '1'"
		  . "\n AND u.gebiet_m = '1'"
		  . "\n AND u.gebiet_n = '1'"
		  . "\n AND u.gebiet_o = '1'"
		  . "\n AND u.gebiet_p = '1'"
		  . "\n AND u.service_a = '1'"
		  . "\n AND u.service_b = '1'"
		  . "\n AND u.service_c = '1'"
		  . "\n AND u.service_d = '1'"
		  . "\n AND u.service_e = '1'"
		  . "\n AND u.service_f = '1'"
		  . "\n AND u.service_g = '1'"
		  . "\n AND u.service_h = '1'"
		  . "\n AND u.service_i = '1'"
		  . "\n AND u.service_j = '1'"
		  . "\n AND u.service_k = '1'"
		  . "\n AND u.service_l = '1'"
		  . "\n AND u.service_n = '1'"
		  . "\n AND u.service_m = '1'"
		  . "\n AND u.service_o = '1'"
		  . "\n AND u.service_p = '1'"
		  . "\n AND u.service_q = '1'"
		  . "\n AND u.service_r = '1'"
		  . "\n AND u.service_s = '1'"
		  . "\n AND u.service_t = '1'"
		  . "\n AND u.service_u = '1'"
		  . "\n AND u.service_v = '1'"
		  . "\n AND u.service_w = '1'"
		  . "\n AND u.service_y = '1'"
		  . "\n AND u.service_z = '1'"
		  . "\n AND u.service_aa = '1'"
		  . "\n AND u.service_bb = '1'"
		  . "\n AND u.service_cc = '1'"
		  . "\n AND u.service_dd = '1'"
		  . "\n AND u.service_ee = '1'"
		  . "\n AND u.service_ff = '1'"
		  . "\n AND u.service_gg = '1'"
		  . "\n AND u.service_hh = '1'"
		  . "\n AND u.service_ii = '1'"
		  . "\n AND u.service_jj = '1'"
		  . "\n AND u.service_kk = '1'"
		  . "\n AND u.service_ll = '1'"
		  . "\n AND u.service_nn = '1'"
		  . "\n AND u.service_mm = '1'"
		  . "\n AND u.service_oo = '1'"
		  . "\n AND u.service_pp = '1'"
		  . "\n AND u.service_qq = '1'"
		  . "\n AND u.service_rr = '1'"
		  . "\n AND u.service_ss = '1'"
		  . "\n AND u.service_tt = '1'"
		  . "\n AND u.service_uu = '1'"
		  . "\n AND u.service_vv = '1'"
		  . "\n AND u.service_ww = '1'"
		  . "\n AND u.service_yy = '1'"
		  . "\n AND u.service_zz = '1'"  
		  . "\n AND u.service_aaa = '1'"
		  . "\n AND u.service_bbb = '1'"
		  . "\n AND u.service_ccc = '1'"
		  . "\n AND u.service_ddd = '1'"
		  . "\n AND u.service_eee = '1'"
		  . "\n AND u.service_fff = '1'"
		  . "\n AND u.service_ggg = '1'"
		  . "\n AND u.service_hhh = '1'"
		  . "\n AND u.service_iii = '1'"
		  . "\n AND u.service_jjj = '1'"
		  . "\n AND u.service_kkk = '1'"
		  . "\n AND u.service_lll = '1'"
		  . "\n AND u.service_nnn = '1'"
		  . "\n AND u.service_mmm = '1'"
		  . "\n AND u.service_ooo = '1'"
		  . "\n AND u.service_ppp = '1'"
		  . "\n AND u.service_qqq = '1'"
		  . "\n ORDER BY " . $order;
          $row = $db->fetch_all($sql);
          
          return $row;

      }

Irgendwie scheint das nicht zu funktionieren
 
Zuletzt bearbeitet:
Schön, ein SQL dass alle Felder auf 1 prüft. Wenn ich verstehen würde was du haben willst, würde ich ev. sehen was da falsch ist.
Was ich auf die schnelle sehe, ist dass du die Tabelle usersettings nirgens mit products oder payments verknüft hast.
Nebenbei vergleichst du deine Felder die als int abgelegt sind mit einem String. nimm die ' bei den Staties weg, denn wu willst ein Zahlenvergleich.
Zudem hat u.uid = '.$uname.' nix im JOIN-Bereich verloren. Das ist eine WHERE-Bedinung.

Also ich fasse mal zusammen was du da hast.
Du verknüpst products mit payments. Dieses kombinierst du lose mit den usersettings des users sofern in den settings alle Staties auf 1 sind.

------ ich glaub, langsam versteh ich halbwegs was du suchst.
Der user hat eine Setting-Tabelle in die viele Statis mit 0 oder 1 eingetragen sind. Nun suchst du alle Produkte die diesem Schlüssel entsprechen.
Annahme meinerseits: Settingfelder die auf 0 sind, bedeuten nicht, dass dass das Produkt dort auch auf 0 sein muss. Aber wenn das Setting auf 1 ist, dann muss das Produkt dort ach eine 1 haben.
Also das Lochkarten-System. Wo in der Setting-Karte ein Loch ist, muss im Produkt ebenfalls ein Loch sein.

SQL:
SELECT
	p.*
FROM
	products AS p,
	usersettings AS u
WHERE
	u.uid = '{$uname}'
	--Mit dem Vergleich 'Grösser als' erreiche ich ,dass wenn u.service_a 0 ist, es egal ist 
	--ob p.service_a 0 oder 1 ist. Wenn aber u.service_a eine 1 ist, dann muss p.service_a 
	--ebenfalls eine 1 sein
	AND p.service_a >= u.service_a
	AND p.service_b >= u.service_b
 
Zuletzt bearbeitet von einem Moderator:
Das hast du echt schön ausgedrückt, genau so ist es gemeint

Der user hat eine Setting-Tabelle mit 70 SQL Strings (anpassbare Statis mit 0 oder 1) und die Products-Tabelle hat 7 SQL Strings (a, b, c, d, e, f und g)

muß ich die Usersettings-Tabelle, mit allen Spalte der Products-Tabelle a, b, c, d, e, f und g vergleichen.

Gibt es eine einfache Methode, wie Array in SQL? (Array nach gleichen Werten durchsuchen)
 
Zuletzt bearbeitet:
Zurück