REPLECE INTO nic nie dodaje i nie zwraca żadnych błedów

0

Witam borykam się z pewnym problemem dodawania wpisów do jednej tabeli biorąc dane z drugiej, i trzeciej. Problemu by nie było gdyby nie to że w jednej z nich są duplikaty które niestety musza zostać, w poszukiwaniu rozwiązania trafiłem na REPLACE INTO które miało załatwić sprawę lecz nic nie pomaga. Jak w temacie nic do tabeli nie zostaje wpisane a błąd żaden się nie pokazuje oto moje zapytanie
TABELA1 -> posiada duplikowane wpisy w sobie $kod powtarza się kilka razy.

 
$add = (" REPLACE INTO `TABELA3` (`id`, `id_cyfry`, `id_kod`) VALUES ('',
  (SELECT `id_cyfra` FROM `TABELA2` WHERE `cyfra` = '$kod'),
  (SELECT `id_kod` FROM `TABELA1` WHERE  `kod` = '$kod') ) ");
  $query = mysql_query($add) or die ("wystąpił błąd na etapie 4 - " .mysql_error() );
  echo "powiązanie - ". $kod ." zostało już skończone<br />";

Wstawiałem również ON DUPLICATE KEY UPDATE, wstawić w zapytanie INSERT INTO ale chyba nie umyślnie bo problem był nadal że powtórzono Key

Co tutaj ze napisałem że nie chce mi nic dodać

0

Wklej tu SHOW CREATE TABLE TABELA3

0

Jeśli dobrze cie zrozumiałem to to:

CREATE TABLE `virtuemart_product_medias` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `virtuemart_product_id` int(1) unsigned NOT NULL DEFAULT '0',
 `virtuemart_media_id` int(1) unsigned NOT NULL DEFAULT '0',
 `ordering` int(2) NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`),
 UNIQUE KEY `i_virtuemart_product_id` (`virtuemart_product_id`,`virtuemart_media_id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8

zapytanie z

   $add = (" INSERT INTO `virtuemart_product_medias` (`id`, `virtuemart_product_id`, `virtuemart_media_id`, `ordering`) VALUES (
  '',
  (SELECT `virtuemart_product_id` FROM `virtuemart_products` WHERE `product_sku` = '$IDD'),
  (SELECT `virtuemart_media_id` FROM `virtuemart_medias` WHERE  `file_meta` = '$IDD'),'1' )
  ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`);
  ");
  $query = mysql_query($add) or die ("wystąpił błąd na etapie 4 - " .mysql_error() );
  echo "to SKU - ". $IDD ." zostało już powiązane<br />";
0

Coś źle zupełnie robisz...

  1. Nie wypełniaj pola id - albo wstaw NUll, albo olej je zupełnie.
  2. REPLACE działa tak, że gdy znajdzie powtórzenie klucza, to podmienia wszystkie inne wartości OPRÓCZ klucza. W tym przypadku powinno to zrobić z ordering. I to działa, bo sprawdziłem na tej strukturze.
  3. id=LAST_INSERT_ID(id) ?? Jeśli już to id=LAST_INSERT_ID(id+1). Ale to i tak nie rozwiąże twojego problemu, to to nie pole id jest problemem
0

nie wiem, czy pomogę, ale wieści nie zawiele. Rozumiem, że jest to MySQL, więc masz trochę dużo opcji wykonaia takiego zapytania jak chcesz:

  • "insert replace" wykasowuje Ci rekordy po zadanym kryterium i wstawia nowe;
  • "insert ignore ... on duplicate key replace" prawie takie samo, ale jak napotka rekord spełniający kryterium po prostu go modyfikuje.

ta mała różnica jest dosyć znacząca i nad zastosowaniem warto by było się zastanowić. Zaprosiłbym również do poczytania dokumentacji, gdyż nie jestem pewien od której wersji servera obie opcje są dostępne.

0

Wiem już mniej więcej o co chodzi, wydaje mi się ze wg błąd robię pobierając z tamtych tabel, bo np jeśli wstawiam ręcznie towar do magazynu i dodaje mu 20 wpisów, ja myślałem ze to przez duplikaty w jednej z tabel ale one na to wpływu nie mają.

to tabela o której mowa tak jak pisze Pan Marcin.Miga zmienia tylko pole ordering np

id vm_p_id vm_p_m oredering
1 233 515 0
2 233 7890 1
3 233 12 2
4 233 234 3
5 234 1242 0
6 234 123 1

To teraz wie gdzie i co muszę zrobić czy coś takiego jak incrementacja tu ząłatwi sprawę?

No i drugie pytanie gdzie wstawić pętle for w zapytanie, przed nim, czy gdzie? jakiś link może do manuala na nic więcej nie liczę

I dziękuję za odpowiedzi które już padły.

0

Ja ...... W jakim to języku??
Chcę ci pomóc, ale sorry - przeczytałem to co napisałeś ponad trzy razy i nic a nic nie skumałem...
Zacznij jeszcze raz od początku. Zdefiniuj problem (nie bazodanowy, tylko życiowy), opisz go i spróbuj go nam przedstawić. Możesz również wcześniej sprawdzić tę metodę: http://tnij.org/u835 (to NIE JEST żart)
Aha, i nie pan...

pozdrawiaMM

0

Wiem że chcesz mi pomóc i to bardzo dobrze wiem.

Dobry pomysł z tą kaczką tylko że nie u mnie, dlaczego? Ponieważ ja już do siebie mówię i to chyba czasami za dużo.

Mój problem opisuję teraz. Napisałem importer danych z pliku xml wstawiający dane do MySQL, na ponad 2200 lin kodu i około 30 zapytań trafiło się jedno które mnie zirytowało, zgnębiło i wdeptało w podłogę. Rozwijam się dalej

Posiadam tabele "a" z danymi o zdjęciach około 50 tyś
Drugą tabele "b" z danymi o produktach około 20 tyś
Trzecią tabele "c" w której muszę no właśnie co ja muszę.

Pobrać id z tabeli "a", pobrać id z tabeli "b" w których jedno pole mają wspólne kod,
(muszę tylko pamiętać że id tabeli "b" może być powtórzone wielokrotnie max 11 razy dla id tabeli "a" (bo tam jeden produkt ma 11 zdjęć)), i tu mi rozjaśniłeś że mam zwiększać w ordering wartość o 1,
więc próbuję z REPLACE INTO potem z INSERT INTO ON...... ordering = ordering +1 potem z tym i tym potem z JOIN potem z innym czymś o czym nie mam pojęcia, potem incrementa, co tam jaszcze już się pogubiłem

To jest mój problem NIE UMIEM TEGO ZROBIĆ.

Mój kod analizowałem i bład mam tylko w tym co chcę zrobić

<?php
include ('conf.php');
?>

<form ction="idcat.php" method="POST" />
<input type="submit" name="wczytaj" value="Wylistuj produkty" />
<input type="submit" name="dodaj" value="Wstaw produkty" />
<input type="submit" name="zdjecia" value="Dodaj zdjecia" />
</form>

<?php

	//wczytanie pliku xml
		$xml = simplexml_load_file('upload/action.xml') or die ("Error 3" .mysql_error() );
		
		foreach($xml->produkty->produkt as $pr){
		$id = $pr['id'];
		$nazwa = $pr['nazwa'];
		$producent = $pr['producent'];
		$grupa = $pr['grupa'];
		$cena = $pr['cena_netto'];
		$cena_sug = $pr['cena_sugerowana'];
		$magazyn = $pr['dostepny'];
		$public = 1;
		
		//wyswietlenie produktow
		if($_POST['wczytaj']){
		echo "<table border=1 collspan=2 cellspan=2><tr>";
							echo "<td>" . $id . "</td>";
							echo "<td>" . $nazwa . "</td>";
							echo "<td>" . $producent . "</td>";
							echo "<td>" . $grupa . "</td>";
							echo "<td>" . $cena . "</td>";
							echo "<td>" . $cena_sug . "</td>";
							echo "<td>" . $magazyn . "</td>";
							echo "</tr></table>";
		}//koniec wyswietlania
		
		// 1.2 dodawanie produktow
		if($_POST['dodaj']){
		// 1 sprawdz czy sku juz jest
		$zapytanie = ("SELECT `product_sku` FROM `".$pref."virtuemart_products` WHERE `product_sku` = '$id'");
		$wyslij = mysql_query($zapytanie, $con) or die ("Error 7 ". mysql_error() );
		$row = mysql_fetch_row($wyslij);
		
		if($row){
		echo " To SKU - ". $id ." znajduje już się w bazie<br />";
		//update stanu magazynowego
		} else {
		echo " Tego SKU - ". $id ." nie ma jeszcze w bazie zostanie dodany<br />";
		$query = ("INSERT INTO `".$pref."virtuemart_products` (`product_sku`, `product_in_stock`, `metaauthor`, `published`) VALUES ('$id', '$magazyn', '$grupa' ,'$public') ");
		$result = mysql_query($query, $con) or die ("Error 8 ". mysql_error() );
		
		echo "  SKU - ". $id ." zostało dodane pomyślnie!<br />";
		 }
		}
		//koniec 1.2
		
		
		//zdjecia 1.3
		if($_POST['zdjecia']){
		
		$left = ("SELECT `".$pref."virtuemart_products`.`virtuemart_product_id`,`".$pref."virtuemart_medias`.`virtuemart_media_id`
			FROM `".$pref."virtuemart_products`,`".$pref."virtuemart_medias`
			WHERE `".$pref."virtuemart_products`.`product_sku` = `".$pref."virtuemart_medias`.`sku`");
			$res = mysql_query($left, $con) or die ("Error 500 -". mysql_error());
		
		while ($row = mysql_fetch_row($res)){
		echo $row['virtuemart_product_id'] ." - " . $row['virtuemart_media_id'] ."<br />";

		
		/**while($row = mysql_fetch_array($result)){
	echo $row['Position']. " - ". $row['Meal'];
	echo "<br />";**/
		}
		
		/**$zdjecia = ("INSERT INTO `".$pref."virtuemart_product_medias` (`virtuemart_product_id`, `virtuemart_media_id`, `ordering`) VALUES (
		(SELECT `virtuemart_product_id` FROM `".$pref."virtuemart_products` WHERE `product_sku` = '$id'),
		(SELECT `virtuemart_media_id` FROM `".$pref."virtuemart_medias` WHERE `sku` = '$id'), '+1' ) 
		ON DUPLICATE KEY UPDATE `ordering` =  (ordering + 1);
		");
		$wynik = mysql_query($zdjecia, $con) or die ("Error 8 - ". mysql_error() );
		 //ON DUPLICATE KEY UPDATE `ordering` = ordering + 1;**/

		}//koniec 1.3

		}
?>		 
0

:)
Problem rozwiązałem :)

 
		foreach($xml->produkty->produkt as $pr){
		$IDD = $pr['id'];
		


if($_POST['zdjecia']){
		$s = ("SELECT hclwu_virtuemart_products.virtuemart_product_id, hclwu_virtuemart_medias.virtuemart_media_id 
		FROM hclwu_virtuemart_products JOIN hclwu_virtuemart_medias ON hclwu_virtuemart_products.product_sku = '$IDD' AND hclwu_virtuemart_medias.sku = '$IDD'");
		$d = mysql_query($s, $con) or die ("rt". mysql_error() );

	   $i = 0;
	   
		while($row = mysql_fetch_assoc($d)){
        if($row){   //tego mi tu caly czas brakowalo

		$IdP = $row['virtuemart_product_id'];
		$IdZ = $row['virtuemart_media_id'];
        
		$z = $i++;
		
			//echo $IdP ." - ". $IdZ ." - ". $z  ."<br />";
		
		$w = ("REPLACE INTO `hclwu_virtuemart_product_medias` SET `virtuemart_product_id` = '$IdP', `virtuemart_media_id` = '$IdZ', `ordering`= '$z'");
		$g = mysql_query($w, $con) or die ("Error 456 - ". mysql_error($s) );
		if($g){
			echo $IDD ."ma juz powiązanie". $IdP ." - ". $IdZ ." - ". $i  ."<br />";
		} else {
			echo "nic nie dodano";
		}

1 użytkowników online, w tym zalogowanych: 0, gości: 1